不会用线段树写所以用的ST表
不用考虑调 N 和数组的大小,调过了没什么用
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ctrue printf("true\n")
#define cfalse printf("false\n")
#define cmaybe printf("maybe\n")
const int N=5e4+10;
int n,m;
int a[N],fy[N],fx[N][20],lg[N];
map<int,int> year;
int lower(int x,int r){
int l=1,ans;
while(l<=r){
int mid=l+r>>1;
if(fy[mid]<x) ans=mid,l=mid+1;
else r=mid-1;
}
return ans;
}
int upper(int x,int l){
int r=n,ans;
while(l<=r){
int mid=l+r>>1;
if(fy[mid]>x) ans=mid,r=mid-1;
else l=mid+1;
}
return ans;
}
signed main(){
scanf("%lld",&n);
for(int i=1;i<=n;i++){
scanf("%lld%lld",&fy[i],&fx[i][0]);
year[fy[i]]=i;
}
lg[1]=0;
for(int i=2;i<=n;i++) lg[i]=lg[i>>1]+1;
for(int j=1;j<=lg[n];j++){
for(int i=1;i<=n-(1<<j)+1;i++){
fx[i][j]=max(fx[i][j-1],fx[i+(1<<j-1)][j-1]);
}
}
scanf("%lld",&m);
while(m--){
int x,y,l,r;
scanf("%lld%lld",&x,&y);
if(year[x] && year[y]){
l=year[x]+1;r=year[y]-1;
int k=lg[r-l+1];
if(fx[r+1][0]>fx[l-1][0] || max(fx[l][k],fx[r-(1<<k)+1][k])>=fx[r+1][0]) cfalse;
else if(y-x>r-l+2) cmaybe;
else ctrue;
}else if(year[y]){
r=year[y]-1;l=lower(x,r)+1;
int k=lg[r-l+1];
max(fx[l][k],fx[r-(1<<k)+1][k]) < fx[r+1][0] ? cmaybe : cfalse;
}else if(year[x]){
l=year[x]+1;r=upper(y,l);
int k=lg[r-l+1];
max(fx[l][k],fx[r-(1<<k)+1][k]) < fx[l-1][0] ? cmaybe : cfalse;
}else cmaybe;
}
return 0;
}