比赛 2025.3.29 评测结果 AAAAAAAAAA
题目名称 排序 最终得分 100
用户昵称 zqy 运行时间 4.894 s
代码语言 C++ 内存使用 5.25 MiB
提交时间 2025-03-29 10:19:14
显示代码纯文本
#include <iostream>
#include <cstdio>
using namespace std;
const int N=1e5+10;
int n,m,num[N],a[N],l[N],r[N],b[N],op[N],q;
struct node{
	int l,r,sum,tag,used;
}tr[N<<2];
void push_up(int p){
	tr[p].sum=tr[p<<1].sum+tr[p<<1|1].sum;
}
void push_down(int p,int ls,int rs){
	if(!tr[p].used)return;
	tr[ls].tag=tr[rs].tag=tr[p].tag;
	tr[ls].used=tr[rs].used=1;
	tr[ls].sum=(tr[ls].r-tr[ls].l+1)*tr[p].tag;
	tr[rs].sum=(tr[rs].r-tr[rs].l+1)*tr[p].tag;
	tr[p].tag=0,tr[p].used=0;
	return;
}
void build(int p,int l,int r){
	tr[p]=node{l,r,num[l],0,0};
	if(l==r)return;
	int mid=(l+r)>>1;
	build(p<<1,l,mid);
	build(p<<1|1,mid+1,r);
	push_up(p);
	return;
}
void change(int p,int l,int r,int x){
	if(l<=tr[p].l&&tr[p].r<=r){
		tr[p].tag=x,tr[p].used=1;
		tr[p].sum=(tr[p].r-tr[p].l+1)*x;
		return;
	}else{
		push_down(p,p<<1,p<<1|1);
		int mid=(tr[p].l+tr[p].r)>>1;
		if(l<=mid)change(p<<1,l,r,x);
		if(r>mid)change(p<<1|1,l,r,x);
		push_up(p);
	}
}
int ask(int p,int l,int r){
	if(l<=tr[p].l&&tr[p].r<=r){
		return tr[p].sum;
	}else{
		push_down(p,p<<1,p<<1|1);
		int mid=(tr[p].l+tr[p].r)>>1,cnt=0;
		if(l<=mid)cnt+=ask(p<<1,l,r);
		if(r>mid)cnt+=ask(p<<1|1,l,r);
		push_up(p);
		return cnt;
	}
}
void clear(int p,int l,int r){
	tr[p]=node{0,0,0,0,0};
	if(l==r)return;
	int mid=(l+r)>>1;
	clear(p<<1,l,mid);
	clear(p<<1|1,mid+1,r);
	return;
}
bool judge(int x){
	for(int i=1;i<=n;i++){
		num[i]=0;
		if(a[i]>=x)num[i]=1;
	}
	build(1,1,n);
	for(int i=1;i<=m;i++){
		int cnt=ask(1,l[i],r[i]);
		if(op[i]==0){
			if(l[i]<=r[i]-cnt)change(1,l[i],r[i]-cnt,0);
			if(r[i]-cnt+1<=r[i])change(1,r[i]-cnt+1,r[i],1);
		}else{
			if(l[i]<=l[i]+cnt-1)change(1,l[i],l[i]+cnt-1,1);
			if(l[i]+cnt<=r[i])change(1,l[i]+cnt,r[i],0);
		}
	}
	int res=ask(1,q,q);
	clear(1,1,n);
	if(res==1)return 1;
	else return 0;
}
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",a+i);
	}
	for(int i=1;i<=m;i++){
	    scanf("%d %d %d",op+i,l+i,r+i);
	}
	scanf("%d",&q);
	int L=1,R=n;
	while(L<R){
		int mid=(L+R+1)>>1;
		if(judge(mid))L=mid;
		else R=mid-1;
	}
	printf("%d\n",L);
	return 0;
}