太难写了,评论区样例也试了不大能理解,求谁指出一下问题。
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define For(i,l,r) for(int i=l;i<=r;i++)
int n,q;
const int N=5e4+10;
int y[N],r[N];
void T(){cout<<"true\n";}
void F(){cout<<"false\n";}
void M(){cout<<"maybe\n";}
map<int,int>m;
bool w[N];
int s[N];
//区间max:ST表
int f[N][30];
void init(){
for(int j=1;(1<<j)<=n;j++){
for(int i=1;i+(1<<j)-1<=n;i++){
f[i][j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1]);
}
}
}
int qry(int l,int r){
if(r<l)return -1e18;
int k=log2(r-l+1);
return max(f[l][k],f[r-(1<<k)+1][k]);
}
bool chk(int l,int r){
//y[l]-y[r]之间有没有缺漏年份
//w[l]-w[r-1]有没有等于1的
//sigma l<=k<r w[k] >0 return 1
if(s[r-1]-s[l-1]>0)return 1;
else return 0;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n;
For(i,1,n){
cin>>y[i]>>r[i];
m[y[i]]=i;
f[i][0]=r[i];
}
init();
For(i,1,n){
if(y[i+1]-y[i]!=1){
w[i]=1;//y[i]后不连续
}
}
For(i,1,n-1)s[i]=s[i-1]+w[i];
cin>>q;
while(q--){
int a,b;cin>>b>>a;//b<a
if(a==b+1){T();continue;}
if(!m[a]){M();continue;}
if(!m[b]){
//找离y最近的年份,如果之间max超了就是F
//否则M
int id=lower_bound(y+1,y+n+1,b)-y;
int res=qry(id,m[a]-1);//r[id]-r[m[a]-1]max值
if(res>=r[m[a]])F();
else M();
continue;
}
//a,b都在
int res=qry(m[b]+1,m[a]-1);//r[m[b]+1]-r[m[a]-1]max
if(res>=r[m[a]]){F();continue;}
if(chk(m[b],m[a]))M();
else T();
}
return 0;
}