最水最水最水的一道题目, 完全不需要多说
const int N = 50010, D = 17;
struct Node {
int Year, Water;
Node() {}
Node(int _Year, int _Water) : Year(_Year), Water(_Water) {}
} Dat[N];
int Dp[D][N];
int n, m;
inline void Input() {
scanf("%d", &n);
For(i, 1, n) scanf("%d%d", &Dat[i].Year, &Dat[i].Water);
// build
For(i, 1, n) Dp[0][i] = Dat[i].Water;
For(i, 1, D) {
if(1 << i > n) break;
int len = 1 << (i - 1);
Ford(j, n - len, 1)
Dp[i][j] = i ? max(Dp[i - 1][j], Dp[i - 1][j + len]) : Dat[j].Water;
}
}
inline int Find1(int x) {
int lef = 1, rig = n, mid, ret = n + 1;
while(lef <= rig) {
mid = (lef + rig) >> 1;
if(Dat[mid].Year < x) lef = mid + 1;
else rig = (ret = mid) - 1;
}
return ret;
}
inline int Find2(int x) {
int lef = 1, rig = n, mid, ret = 0;
while(lef <= rig) {
mid = (lef + rig) >> 1;
if(Dat[mid].Year > x) rig = mid - 1;
else lef = (ret = mid) + 1;
}
return ret;
}
inline int See(int L, int R) {
if(L > R || L > n) return -INF;
int len = R - L + 1, Dep;
for(Dep = 0; 1 << (Dep + 1) <= len; Dep++) ;
return max(Dp[Dep][L], Dp[Dep][R - (1 << Dep) + 1]);
}
inline void Solve() {
Dat[0] = Node(-INF, -INF);
for(scanf("%d", &m); m--; ) {
int Left, Right, W1, W2;
scanf("%d%d", &Left, &Right);
W1 = Find1(Left), W2 = Find2(Right);
if(Dat[W2].Year ^ Right) {
if(Dat[W1].Year == Left) {
if(See(W1 + 1, W2) < Dat[W1].Water) printf("maybe\n");
else printf("false\n");
} else printf("maybe\n");
} else if(Dat[W1].Year == Left) {
if(Dat[W2].Water > Dat[W1].Water || See(W1 + 1, W2 - 1) >= Dat[W2].Water) printf("false\n");
else if(W2 - W1 == Dat[W2].Year - Dat[W1].Year) printf("true\n");
else printf("maybe\n");
} else {
if(See(W1, W2 - 1) >= Dat[W2].Water) printf("false\n");
else printf("maybe\n");
}
}
}
int main() {
#ifndef ONLINE_JUDGE
SETIO("1067");
#endif
Input();
Solve();
return 0;
}