这恐怕是见过最恶心的题目了...
一开始题目意思都理解错了,然而样例能过...
总之题解就看hzwer的吧...
http://hzwer.com/1655.html
区间最值我用的RMQ,当然线段树也ojbk。。。
代码可读性还是有的
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define LL long long
#define clr(x,i) memset(x,i,sizeof(x))
using namespace std;
const int N=50005,INF=2e9;
int n,q,a[N],w[N],rk[N],ma[N][21],st;
void presolve()
{
for(int j=1;j<20;j++)
for(int i=1;i+(1<<j)-1<=n;i++)
ma[i][j]=max(ma[i][j-1],ma[i+(1<<(j-1))][j-1]);
}
int ask(int l,int r)
{
if(l>r)return -INF;
int j=0;
//while(l+(1<<j)-1<r)j++;
j=(int)(log(r-l+1)/log(2));
return max(ma[l][j],ma[r-(1<<j)+1][j]);
}
inline void ans(int f)
{
if(f<=-1)printf("false\n");
if(f==0)printf("maybe\n");
if(f>=1)printf("true\n");
}
void in()
{
freopen("bzoj1067.in","r",stdin);
freopen("bzoj1067.out","w",stdout);
}
int main()
{
in();
scanf("%d",&n);
clr(ma,130);
for(int i=1;i<=n;i++)
scanf("%d%d",&a[i],&w[i]),rk[i]=a[i],ma[i][0]=w[i];
st=a[1];
presolve();
scanf("%d",&q);
while(q--)
{
int be,en,x,y,maxv,f1=1,ff=0,fx=0,fy=0;
scanf("%d%d",&x,&y);
if(y<=x) {ans(-111);continue;}
be=lower_bound(a+1,a+n+1,x)-a;
en=lower_bound(a+1,a+n+1,y)-a;
if(x!=a[be])
fx=1;
if(y!=a[en])
fy=1;
if(fx&&fy)
{ans(0);continue;}
if(!fx&&a[be+1]-a[be]!=1)ff=1;
if(!fy&&a[en]-a[en-1]!=1)ff=1;
if(!fx&&!fy&&en-be!=y-x)ff=1;
if(!fx)
maxv=ask(be+1,en-1);
else if(fx&&!fy)
maxv=ask(be,en-1);
if(!fx&&!fy&&w[be]>=w[en]&&maxv<w[en])
if(!ff)
{ans(123);continue;}
else
{ans(0);continue;}
else if(!fx&&fy&&maxv<w[be])
{ans(0);continue;}
else if(fx&&!fy&&maxv<w[en])
{ans(0);continue;}
ans(-111);
}
return 0;
}