记录编号 599882 评测结果 AAAAAAAAAA
题目名称 [HEOI 2016] 排序 最终得分 100
用户昵称 Gravatar秋_Water 是否通过 通过
代码语言 C++ 运行时间 5.783 s
提交时间 2025-03-29 22:51:15 内存使用 14.98 MiB
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
const int N=1e6+5;
struct node{
	int l,r,sum1;
	int col;
}t[4*N];
int a[N],ql[N],qr[N],qop[N],cnt,n,m,ans,q;
void pushdown(int k,int l,int r){
	if(t[k].col!=0){
		t[t[k].l].col=t[t[k].r].col=t[k].col;
		if(t[k].col==1){
			int mid=l+r>>1;
			t[t[k].l].sum1=mid-l+1;
			t[t[k].r].sum1=r-mid;
		}
		else{
			t[t[k].l].sum1=0;
			t[t[k].r].sum1=0;			
		}
		t[k].col=0;
	}	
}
void build(int &p,int l,int r,int k){
	p=++cnt;
	if(l==r){
		t[p].sum1=(a[l]>=k);
		t[p].col=0;
		return;
	}
	int mid=l+r>>1;
	build(t[p].l,l,mid,k);
	build(t[p].r,mid+1,r,k);
	t[p].sum1=t[t[p].l].sum1+t[t[p].r].sum1;
	t[p].col=0;
} 
int query(int p,int l,int r,int ql,int qr){
	if(ql<=l&&qr>=r){
		return t[p].sum1;
	}
	if(ql>r||qr<l) return 0;
	if(l>r){
		return 0;
	} 
	pushdown(p,l,r);
	int mid=l+r>>1;
	return query(t[p].l,l,mid,ql,qr)+query(t[p].r,mid+1,r,ql,qr);
}
void moditf(int k,int ql,int qr,int l,int r,int val){
    if (ql>r||qr<l) return;    
    if(ql<=l&&qr>=r){
    	t[k].sum1=(r-l+1)*val;
		if(val==1) t[k].col=1;
		else{
			t[k].col=-1;
		}
        return;
    }	
	pushdown(k,l,r);
    int mid=l+r>>1;
    moditf(t[k].l,ql,qr,l,mid,val);
    moditf(t[k].r,ql,qr,mid+1,r,val);
    t[k].sum1=t[t[k].l].sum1+t[t[k].r].sum1;
}
bool cheak(int x){
	int root=0;
	build(root,1,n,x);
	for(int i=1;i<=m;i++){
		int tot=query(root,1,n,ql[i],qr[i]);
		if(qop[i]==0){
			moditf(root,qr[i]-tot+1,qr[i],1,n,1);
			moditf(root,ql[i],qr[i]-tot,1,n,0);
		}
		else{
			moditf(root,ql[i],ql[i]+tot-1,1,n,1);
			moditf(root,ql[i]+tot,qr[i],1,n,0);			
		}
	}
	return query(root,1,n,q,q);
}
int main(){
	freopen("heoi2016_sort.in","r",stdin);
	freopen("heoi2016_sort.out","w",stdout);
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	for(int i=1;i<=m;i++){
		cin>>qop[i]>>ql[i]>>qr[i];
	}
	cin>>q;
	int l=1,r=n,mid;
	while(l<=r){
		mid=l+r>>1;
		if(cheak(mid)){
			ans=mid;
			l=mid+1;
		}
		else{
			r=mid-1;
		}
	}
	cout<<ans;

	return 0;
}