我也一样(线段树)
```cpp
#include <bits/stdc++.h>
using namespace std;
const int N = 5e4 + 5;
int n, m, X, Y, maxn[N << 2], id[N << 2];
map <int, int> mp;
struct node{
int y, r;
} a[N];
void push_up(int k){
if(maxn[k << 1] > maxn[k << 1 | 1]){
maxn[k] = maxn[k << 1];
id[k] = id[k << 1];
}
else{
maxn[k] = maxn[k << 1 | 1];
id[k] = id[k << 1 | 1];
}
}
void build(int k, int l, int r){
if(l == r){
maxn[k] = a[l].r;
id[k] = a[l].y;
return;
}
int mid = (l + r) >> 1;
build(k << 1, l, mid);
build(k << 1 | 1, mid + 1, r);
push_up(k);
}
pair <int, int> query(int k, int l, int r, int x, int y){
if(x <= l && r <= y) return make_pair(maxn[k], id[k]);
int mid = (l + r) >> 1, res = 0, p = 0;
if(x <= mid){
pair <int, int> qwq = query(k << 1, l, mid, x, y);
res = qwq.first; p = qwq.second;
}
if(mid < y){
pair <int, int> qwq = query(k << 1 | 1, mid + 1, r, x, y);
if(qwq.first >= res){
res = qwq.first;
p = qwq.second;
}
}
return make_pair(res, p);
}
int find(int year){
int l = 1, r = n, pos = 0;
while(l <= r){
int mid = (l + r) >> 1;
if(a[mid].y > year){
pos = mid;
r = mid - 1;
}
else l = mid + 1;
}
return pos;
}
int main(){
scanf("%d", &n);
for(int i = 1; i <= n; i++){
scanf("%d%d", &a[i].y, &a[i].r);
mp[a[i].y] = i;
}
build(1, 1, n);
scanf("%d", &m);
while(m--){
scanf("%d%d", &X, &Y);
int L = mp[X], R = mp[Y];
if(!L && !R){
printf("maybe\n");
continue;
}
if(!L){
int ji = find(X);
pair <int, int> qwq = query(1, 1, n, ji, R);
if(qwq.second != Y) printf("false\n");
else printf("maybe\n");
continue;
}
if(!R){
int ji = find(Y) - 1;
pair <int, int> qwq = query(1, 1, n, L, ji);
if(qwq.second != X) printf("false\n");
else printf("maybe\n");
continue;
}
pair <int, int> qwq = query(1, 1, n, L, R);
if(a[L].r < a[R].r || qwq.second != X && qwq.second != Y) printf("false\n");
else if(R - L != Y - X) printf("maybe\n");
else printf("true\n");
}
return 0;
}
```
by sheryang_AC @ 2024-03-25 15:28:58