求调,玄关,球球了
查看原帖
求调,玄关,球球了
1307045
Dark_Knight_AK_ALL楼主2025/7/23 13:34
#include<bits/stdc++.h>
using namespace std;
int w[400001];
int lazy[400001];
int l[100001],r[100001],op[1000001],a[100001];
int n,m,q;
int ls(int x)
{
    return x<<1;
}
int rs(int x)
{
    return x<<1|1;
}
void pushup(int x)
{
    w[x]=w[ls(x)]+w[rs(x)];
}
void build(int l,int r,int x,int k)
{
    if(l==r)
    {
        lazy[x]=-1;
        if(a[l]>=k)
            w[x]=1;
        else w[x]=0;
        return;
    }
    int mid=l+r>>1;
    if(l<=mid)
        build(l,mid,ls(x),k); 
    if(r>mid)
        build(mid+1,r,rs(x),k);
    pushup(x);
}
void pushdown(int x,int l,int r)
{
    if(lazy[x]==-1)
        return;
    int mid=l+r>>1;
    lazy[ls(x)]=lazy[rs(x)]=lazy[x];
    w[ls(x)]=lazy[x]*(mid-l+1);
    w[rs(x)]=lazy[x]*(r-mid);
    lazy[x]=-1;
}
void update(int l,int r,int x,int L,int R,int k)
{
	if(l>=r)
	return;
    if(L<=l&&r<=R)
    {
        if(k==1)
        w[x]=r-l+1;
        else w[x]=0;
        lazy[x]=k;
        return;
    }
    pushdown(x,l,r);
    int mid=l+r>>1;
    if(L<=mid)
        update(l,mid,ls(x),L,R,k);
    else update(mid+1,r,rs(x),L,R,k);
    pushup(x);
}
int query(int l,int r,int x,int L,int R)
{
    if(L<=l&&r<=R)
    {
        return w[x];
    }
    pushdown(x,l,r);
    int mid=l+r>>1,ans=0;
    if(L<=mid)
        ans+=query(l,mid,ls(x),L,R);
    else ans+=query(mid+1,r,rs(x),L,R);
    return ans;
}
bool check(int x)
{
    build(1,n,1,x);
    for(int i=1;i<=m;i++)
    {
        int L=l[i],R=r[i],OP=op[i];
        int cnt=query(1,n,1,L,R);
        if(OP==0)
        {
            update(1,n,1,R-cnt+1,R,1);
            update(1,n,1,L,R-cnt,0);
        }
        else{
            update(1,n,1,L,L+cnt-1,1);
            update(1,n,1,L+cnt,R,0);
        }
    }
    return query(1,n,1,q,q);
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    for(int i=1;i<=m;i++)
        cin>>op[i]>>l[i]>>r[i];
    int l=1,r=n;
    cin>>q;
    int ans;
    while(l<=r)
    {
        int mid=l+r>>1;
        if(check(mid))
            l=mid+1,ans=mid;
        else r=mid-1;
        //cout<<l<<" "<<r<<endl;
    }
    cout<<ans;
}
2025/7/23 13:34
加载中...