记录编号 359193 评测结果 AAAAAAAAAA
题目名称 [HEOI 2016] 排序 最终得分 100
用户昵称 GravatarFoolMike 是否通过 通过
代码语言 C++ 运行时间 9.204 s
提交时间 2016-12-21 09:34:46 内存使用 10.91 MiB
显示代码纯文本
#include<cstdio>
const int N=5e5+10;
int n,m,q,a[N],l[N],r[N],tp[N];
#define lc x<<1
#define rc (x<<1)|1
int sum[N],tag[N],k[N];
void update(int x){
	sum[x]=sum[lc]+sum[rc];
}
void pushdown(int x,int l,int r){
	if (l!=r&&tag[x]!=-1){
		int mid=(l+r)>>1;
		tag[lc]=tag[rc]=tag[x];
		sum[lc]=(mid-l+1)*tag[x];
		sum[rc]=(r-mid)*tag[x];
		tag[x]=-1;
	}
}
void clear(int x,int l,int r){
	tag[x]=-1;
	if (l==r){sum[x]=k[l];return;}
	int mid=(l+r)>>1;
	clear(lc,l,mid);
	clear(rc,mid+1,r);
	update(x);
}
void change(int x,int l,int r,int L,int R,int d){
	pushdown(x,l,r);
	if (l>=L&&r<=R){
		tag[x]=d;sum[x]=(r-l+1)*d;
		return;
	}
	int mid=(l+r)>>1;
	if (R>mid) change(rc,mid+1,r,L,R,d);
	if (L<=mid) change(lc,l,mid,L,R,d);
	update(x);
}
int getsum(int x,int l,int r,int L,int R){
	pushdown(x,l,r);
	if (l>=L&&r<=R) return sum[x];
	int mid=(l+r)>>1,ans=0;
	if (R>mid) ans+=getsum(rc,mid+1,r,L,R);
	if (L<=mid) ans+=getsum(lc,l,mid,L,R);
	update(x);
	return ans;
}
void A(){
	
}
int erfen(int L,int R){
	if (L==R) return L;
	int mid=(L+R)>>1;
	for (int i=1;i<=n;i++) k[i]=a[i]>mid;
	clear(1,1,n);
	for (int i=1;i<=m;i++){
		if (i==61) A();
		int x=getsum(1,1,n,l[i],r[i]);
		change(1,1,n,l[i],r[i],0);
		if (x&&tp[i]) change(1,1,n,l[i],l[i]+x-1,1);
			else change(1,1,n,r[i]-x+1,r[i],1);
	}
	int ans=getsum(1,1,n,q,q);
	return ans?erfen(mid+1,R):erfen(L,mid); 
}
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",&tp[i],&l[i],&r[i]);
	scanf("%d",&q);
	printf("%d\n",erfen(1,n));
	return 0;
}