记录编号 616831 评测结果 AAAAAAAAAA
题目名称 2276.[HEOI 2016] 排序 最终得分 100
用户昵称 Gravatarexil 是否通过 通过
代码语言 C++ 运行时间 7.253 s
提交时间 2026-07-01 10:16:08 内存使用 11.05 MiB
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,m;
int xu[100005];
int lie[100005];
struct node{
    int sum1;
    int sum0;
    int l;
    int r;
    int lan;
};
node tree[600005];
void jianshu(int k,int l,int r){
    tree[k]={0,0,l,r,0};
    if(l==r){
        if(lie[l]==1)tree[k].sum1=1,tree[k].sum0=0;
        else tree[k].sum0=1,tree[k].sum1=0;
        return;
    }
    int mid=(l+r)/2;
    jianshu(k<<1,l,mid);
    jianshu(k<<1|1,mid+1,r);
    tree[k].sum1=tree[k<<1].sum1+tree[k<<1|1].sum1;
    tree[k].sum0=tree[k<<1].sum0+tree[k<<1|1].sum0;
}
vector<int> v[100005];
void pushdown(int x){
    if(tree[x].lan==0)return;
    tree[x<<1].lan=tree[x].lan;
    tree[x<<1|1].lan=tree[x].lan;
    if(tree[x].lan==1){
        tree[x<<1].sum1=tree[x<<1].r-tree[x<<1].l+1;
        tree[x<<1].sum0=0;
        tree[x<<1|1].sum1=tree[x<<1|1].r-tree[x<<1|1].l+1;
        tree[x<<1|1].sum0=0;
    }
    else{
        tree[x<<1].sum0=tree[x<<1].r-tree[x<<1].l+1;
        tree[x<<1].sum1=0;
        tree[x<<1|1].sum0=tree[x<<1|1].r-tree[x<<1|1].l+1;
        tree[x<<1|1].sum1=0;
    }
    tree[x].lan=0;
}
void add(int k,int l,int r,int v){
    if(tree[k].l>r || tree[k].r<l)return;
    pushdown(k);
    if(tree[k].l>=l && tree[k].r<=r){
        if(v==1){
            tree[k].sum1=tree[k].r-tree[k].l+1;
            tree[k].sum0=0;
            tree[k].lan=1;
            return;
        }
        else{
            tree[k].sum0=tree[k].r-tree[k].l+1;
            tree[k].sum1=0;
            tree[k].lan=2;
            return;
        }
    }
    add(k<<1,l,r,v);
    add(k<<1|1,l,r,v);
    tree[k].sum1=tree[k<<1].sum1+tree[k<<1|1].sum1;
    tree[k].sum0=tree[k<<1].sum0+tree[k<<1|1].sum0;
}
int cha(int k,int l,int r,int v){
    if(tree[k].l>r || tree[k].r<l)return 0;
    pushdown(k);
    if(tree[k].l>=l && tree[k].r<=r){
        if(v==1)return tree[k].sum1;
        else return tree[k].sum0;
    }
    return cha(k<<1,l,r,v)+cha(k<<1|1,l,r,v);
}
signed main(){
    cin>>n>>m;
    for(int i = 1;i<=n;i++){
        cin>>xu[i];
    }
    for(int i = 1;i<=m;i++){
        int a,b,c;
        cin>>a>>b>>c;
        v[i].push_back(a),v[i].push_back(b),v[i].push_back(c);
    }
    int l=1,r=n;
    int ans=0;
    int q;
    cin>>q;
    while(l<=r){
        int mid=(l+r)/2;
        for(int i = 1;i<=n;i++){
            if(xu[i]>=mid)lie[i]=1;
            else lie[i]=0;
        }
        jianshu(1,1,n);
        for(int i = 1;i<=m;i++){
            if(v[i][0]==0){
                int l=v[i][1],r=v[i][2];
                int shu0=cha(1,l,r,0);
                add(1,l,shu0+l-1,0);
                add(1,shu0+l,r,1);
            }
            else{
                int l=v[i][1],r=v[i][2];
                int shu1=cha(1,l,r,1);
                add(1,l,shu1+l-1,1);
                add(1,l+shu1,r,0);
            }
        }
        if(cha(1,q,q,1)==1){
            l=mid+1;
            ans=mid;
        }
        else r=mid-1;
        
    }
    cout<<ans;
    return 0;
}