L
u
o
g
u
Luogu
Luogu
l
i
n
k
link
link
分析:
很显然的思路 就是每次找出
[
X
,
Y
]
[X,Y]
[X,Y]年份间的最大降水量 然后判真假 线段树即可
m
a
y
b
e
maybe
maybe比较难判 要看
X
,
Y
X,Y
X,Y是否知道降水量 有可能都不知道 或知道一个 就要具体处理
CODE:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=5e4+5;
int n,T,year[N],rain[N],tree[N<<2];
void up(int x){tree[x]=max(tree[x<<1],tree[x<<1|1]);}
void update(int x,int l,int r,int p,int k)
{
if(l==r)
{
tree[x]=k;
return;
}
int mid=(l+r)>>1;
if(p<=mid) update(x<<1,l,mid,p,k);
else update(x<<1|1,mid+1,r,p,k);
up(x);
}
int query(int x,int l,int r,int L,int R)
{
if(L<=l&&r<=R) return tree[x];
int mid=(l+r)>>1,res=0;
if(L<=mid) res=query(x<<1,l,mid,L,R);
if(mid<R) res=max(res,query(x<<1|1,mid+1,r,L,R));
return res;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d%d",&year[i],&rain[i]);
update(1,1,n,i,rain[i]);
}
scanf("%d",&T);
while(T--)
{
int X,Y;
scanf("%d%d",&Y,&X);
int p1=lower_bound(year+1,year+n+1,Y)-year,p2=lower_bound(year+1,year+n+1,X)-year;
bool f1=(p1==n+1||year[p1]^Y)?0:1;
bool f2=(p2==n+1||year[p2]^X)?0:1;
if(!f1&&!f2) puts("maybe");
else if(f1&&f2)
{
if(rain[p1]<rain[p2]) puts("false");
else if(Y+1==X) puts("true");
else if(p1+1==p2) puts("maybe");
else if(query(1,1,n,p1+1,p2-1)>=rain[p2]) puts("false");
else if(X-Y==p2-p1) puts("true");
else puts("maybe");
}
else if(f1)
{
if(p1+1==p2) puts("maybe");
else if(query(1,1,n,p1+1,p2-1)>=rain[p1]) puts("false");
else puts("maybe");
}
else if(f2)
{
if(p1==p2) puts("maybe");
else if(query(1,1,n,p1,p2-1)>=rain[p2]) puts("false");
else puts("maybe");
}
}
return 0;
}