比赛 2025.3.29 评测结果 AAAAAAAAAA
题目名称 排序 最终得分 100
用户昵称 徐诗畅 运行时间 4.825 s
代码语言 C++ 内存使用 80.61 MiB
提交时间 2025-03-29 11:37:29
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
const int N=1e7+5;
int n,m,t[N<<1],tag[N<<1];
int a[N],b[N];
void push_up(int p){t[p]=t[p<<1]+t[p<<1|1];}
void build(int p,int l,int r){
	tag[p]=-1;
	if(l==r){
		t[p]=a[l];
		return;
	}
	int mid=(l+r)>>1;
	build(p<<1,l,mid);
	build(p<<1|1,mid+1,r);
	push_up(p);
}
void addtag(int p,int l,int r,int x){
	t[p]=(r-l+1)*x;
	tag[p]=x;
}
void push_down(int p,int l,int r){
	if(tag[p]!=-1){
		int mid=(l+r)>>1;
		addtag(p<<1,l,mid,tag[p]);
		addtag(p<<1|1,mid+1,r,tag[p]);
		tag[p]=-1;
	}
}
void update(int p,int l,int r,int L,int R,int x){
	if(l>r) return;
	if(L<=l&&R>=r){
		addtag(p,l,r,x);
		return;
	}
	push_down(p,l,r);
	int mid=(l+r)>>1;
	if(L<=mid) update(p<<1,l,mid,L,R,x);
	if(R>mid) update(p<<1|1,mid+1,r,L,R,x);
	push_up(p);
}
int query1(int p,int l,int r,int L,int R){
	if(l>r) return 0;
	if(L<=l&&R>=r) return t[p];
	push_down(p,l,r);
	int mid=(l+r)>>1;
	int ans=0;
	if(L<=mid) ans+=query1(p<<1,l,mid,L,R);
	if(R>mid) ans+=query1(p<<1|1,mid+1,r,L,R);
	return ans;
}
int query2(int p,int l,int r,int x){
	if(l>r) return 0;
	if(l==x&&r==x) return t[p];
	push_down(p,l,r);
	int mid=(l+r)>>1;
	if(x<=mid) return query2(p<<1,l,mid,x);
	else return query2(p<<1|1,mid+1,r,x);
}
struct ques{
	int op,l,r;
}q[N];
int main(){
	freopen("heoi2016_sort.in","r",stdin);
	freopen("heoi2016_sort.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(int i = 1;i<=n;i++) scanf("%d",&b[i]);
	for(int i = 1;i<=m;i++)
	scanf("%d%d%d",&q[i].op,&q[i].l,&q[i].r);
	int l = 0,r=n+1;
	int ans=0,o;
	cin>>o;
	while(l+1<r){
		int mid=(l+r)>>1;
		ans=mid;
		memset(t,0,sizeof(t));
		for(int i = 1;i<=n;i++) a[i]=b[i]>=mid?1:0;
		build(1,1,n);
		for(int i = 1;i<=m;i++)
		if(q[i].op==0){
			int k=query1(1,1,n,q[i].l,q[i].r);
			if(k==0) continue;
			update(1,1,n,q[i].r-k+1,q[i].r,1);
			update(1,1,n,q[i].l,q[i].r-k,0);
		}
		else{
			int k=query1(1,1,n,q[i].l,q[i].r);
			if(k==0) continue;
			update(1,1,n,q[i].l,q[i].l+k-1,1);
			update(1,1,n,q[i].l+k,q[i].r,0);
		}
		int v=query2(1,1,n,o);
		if(v==1) l=mid;
		else r=mid;
	}
	printf("%d",l);
	return 0;
}