为何会RE
原题链接:79551.奇怪的区间2025-09-28 19:30:53
发布于:广东
#include<bits/stdc++.h>
using namespace std;
long long n,m,y[300005],tree1[1200005],tree2[1200005];
int ls(int p){return p<<1;}
int rs(int p){return p<<1|1;}
void P(int p){tree1[p]=min(tree1[ls(p)],tree1[rs(p)]);}
void P2(int p){tree2[p]=max(tree2[ls(p)],tree2[rs(p)]);}
void build(int p,int l,int r){
if(l==r){tree1[p]=y[l];return ;}
int mid=(l+r)>>1;
build(ls(p),l,mid);
build(rs(p),mid+1,r);
P(p);
}
void build2(int p,int l,int r){
if(l==r){tree2[p]=y[l];return ;}
int mid=(l+r)>>1;
build2(ls(p),l,mid);
build2(rs(p),mid+1,r);
P2(p);
}
long long qumi(int l,int r,int p,int L,int R){
if(L<=l&&r<=R)return tree1[p];
long long mid=(l+r)>>1,ans=2e18;
if(L<=mid)ans=min(ans,qumi(l,mid,ls(p),L,R));
if(R>=mid)ans=min(ans,qumi(mid+1,r,rs(p),L,R));
return ans;
}
long long quma(int l,int r,int p,int L,int R){
if(L<=l&&r<=R)return tree2[p];
long long mid=(l+r)>>1,ans=-2e18;
if(L<=mid)ans=max(ans,quma(l,mid,ls(p),L,R));
if(R>=mid)ans=max(ans,quma(mid+1,r,rs(p),L,R));
return ans;
}
long long qu(int l,int r,int p,int L,int R,int mi,int ma){
if(L<=l&&r<=R&&quma(l,r,p,l,r)<=ma&&qumi(l,r,p,l,r)>=mi)return l;
long long mid=(l+r)>>1,ans=2e18;
if(L<=mid&&quma(l,mid,ls(p),l,mid)>=mi&&qumi(l,mid,ls(p),l,mid)<=ma)ans=min(ans,qu(l,mid,ls(p),L,R,mi,ma));
if(mid<=R&&quma(mid+1,r,rs(p),mid+1,r)>=mi&&qumi(mid+1,r,rs(p),mid+1,r)<=ma)ans=min(ans,qu(mid+1,r,rs(p),L,R,mi,ma));
return ans;
}
void change(int p){
y[p]=0;
int l=1,r=n,k=1;
while(l!=r){
int mid=(l+r)>>1;
if(mid>=p)r=mid,k=ls(k);
else l=mid+1,k=rs(k);
}
tree1[k]=tree2[k]=0;
while(k){
k/=2;
P(k);
P2(k);
}
}
int main(){
freopen("mins.in","r",stdin);
freopen("mins.out","w",stdout);
cin.tie(0),cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;++i)cin>>y[i];
build(1,1,n);
build2(1,1,n);
int x1,x2,y1,y2;
while(m--){
cin>>x1>>x2>>y1>>y2;
int a=qu(1,n,1,x1,x2,y1,y2);
if(a==2e18)cout<<0<<"\n";
else{
cout<<a<<"\n";
change(a);
}
}
fclose(stdin);
fclose(stdout);
return 0;
}
这里空空如也
有帮助,赞一个