题目地址:https://atcoder.jp/contests/abc389/tasks/abc389_f
#include <stdio.h>
using namespace std;
const int MAXN = 500001;
char gc() {
static char buf[1048576], *p1, *p2;
return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1048576, stdin), p1 == p2) ? EOF : *p1++;
}
int read() {
int x = 0;
char ch = gc();
while (ch < '0' || ch > '9')
ch = gc();
while (ch >= '0' && ch <= '9') {
x = (x << 1) + (x << 3) + ch - '0';
ch = gc();
}
return x;
}
class SegmentTree {
private:
int tree[MAXN << 2], lazy[MAXN << 2];
int lcp(int p) {
return p << 1;
}
int rcp(int p) {
return (p << 1) + 1;
}
int mid(int l, int r) {
return (l + r) >> 1;
}
void under(int p, int l, int r) {
lazy[p] = 0;
if (l == mid(l, r))
tree[lcp(p)]++;
else
lazy[lcp(p)] = 1;
if (r == mid(l, r) + 1)
tree[rcp(p)]++;
else
lazy[rcp(p)] = 1;
}
public :
void build(int p = 1, int l = 1, int r = 500000) {
if (l == r) {
tree[p] = l;
return;
}
build(lcp(p), l, mid(l, r)), build(rcp(p), mid(l, r) + 1, r);
}
void add(int il, int ir, int p = 1, int l = 1, int r = 500000) {
if (ir < l || il > r)
return;
if (il <= l && ir >= r) {
lazy[p] = 1;
return;
}
add(lcp(p), il, ir, l, mid(l, r)), add(rcp(p), il, ir, mid(l, r) + 1, r);
}
int query(int pos, int p = 1, int l = 1, int r = 500000) {
if (l == r)
return tree[p];
if (lazy[p])
under(p, l, r);
if (pos <= mid(l, r))
return query(lcp(p), pos, l, mid(l, r));
else
return query(rcp(p), pos, mid(l, r) + 1, r);
}
int ml(int val, int p = 1, int l = 1, int r = 500000) {
while (l <= r)
if (query(mid(l, r)) >= val)
r = mid(l, r) - 1;
else
l = mid(l, r) + 1;
return l;
}
int mr(int val, int p = 1, int l = 1, int r = 500000) {
while (l <= r)
if (query(mid(l, r)) <= val)
r = mid(l, r) - 1;
else
l = mid(l, r) + 1;
return l;
}
} t;
int main() {
int n = read();
t.build();
while (n--)
t.add(t.ml(read()), t.mr(read()));
int q = read();
while (q--)
printf("%d\n", t.query(read()));
return 0;
}