不知道为什么MLE了五个点,求大佬帮忙看一下问题出在哪里
#include <bits/stdc++.h>
using namespace std;
using ll = int;
const int MAXN = 5e4 + 5;
struct node{
ll l,r,maxx;
};
//权值线段树维护区间最值
ll mark[MAXN << 2], n, m, A[MAXN];
map<ll,ll>LOC;
set<ll>st;
node tree[MAXN<<2];
void build(int p = 1, int cl = 1, int cr = n)
{
if (cl == cr) {tree[p].maxx=A[cl],tree[p].l=tree[p].r=cr;return;}
int mid = (cl + cr) >> 1;
build(p << 1, cl, mid);
build(p << 1 | 1, mid + 1, cr);
tree[p].l=tree[p<<1].l;
tree[p].r=tree[p<<1|1].r;
tree[p].maxx = max(tree[p << 1].maxx , tree[p << 1 | 1].maxx);
}
ll query(int l, int r, int p = 1, int cl = 1, int cr = n)
{
if (cl >= l && cr <= r) return tree[p].maxx;
ll mid = (cl + cr) >> 1, ans = 0;
if (mid >= l) ans =max(ans, query(l, r, p << 1, cl, mid));
if (mid < r) ans =max(ans, query(l, r, p << 1 | 1, mid + 1, cr));
return ans;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++){
ll year;
scanf("%d",&year);
st.insert(year);
LOC[year]=i;
scanf("%d",&A[i]);
}
build();
//cout<<query(2,1)<<endl;
scanf("%d",&m);
while (m--)
{
ll L,R;
scanf("%d%d",&L,&R);
ll LL=LOC[L];
ll RR=LOC[R];
ll MAX=query(LL+1,RR-1);
if(RR==0){
puts("maybe");
continue;
}
else if(LL==0){
// L=*st.lower_bound(L);
auto it=st.lower_bound(L);
if(it==st.end()) it--;
L=*it;
LL=LOC[L];
ll MAX=query(LL+1,RR-1);
if(MAX<A[RR]) puts("maybe");
else puts("false");
continue;
}
if(MAX<A[RR]&&A[RR]<A[LL]){
if(RR-LL==R-L) puts("true");
else puts("maybe");
}
else puts("false");
}
return 0;
}
/*
6
-2002 4920
2003 5901
2004 2832
2005 3890
2007 5609
2008 3024
1
2004 -2002
*/