P2471 降雨量 RE 50pts

不会用线段树写所以用的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;
}