为何会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;
}
这里空空如也











有帮助,赞一个