记录编号 301198 评测结果 AAAAAAAAAA
题目名称 [HEOI 2016] 排序 最终得分 100
用户昵称 GravatarHzoi_ 是否通过 通过
代码语言 C++ 运行时间 10.058 s
提交时间 2016-08-30 17:15:00 内存使用 4.38 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<algorithm>
#define lch l,mid,rt<<1
#define rch mid+1,r,rt<<1|1
using namespace std;
const int maxn=100010;
void build(int,int,int);
void mset(int,int,int);
void qsum(int,int,int);
void pushdown(int,int,int,int);
int n,m,p,b[maxn],L[maxn],R[maxn],Rev[maxn],l,r,ans,a[maxn<<2],lazy[maxn<<2],s,t,x,out;
int main(){
#define MINE
#ifdef MINE
	freopen("heoi2016_sort.in","r",stdin);
	freopen("heoi2016_sort.out","w",stdout);
#endif
	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",&Rev[i],&L[i],&R[i]);
	scanf("%d",&p);
	l=1;
	r=n;
	while(l<=r){
		ans=(l+r)>>1;
		//printf("---ans=%d---\n",ans);
		memset(lazy,-1,sizeof(lazy));
		build(1,n,1);
		//printf("\n");
		for(int i=1;i<=m;i++){
			out=0;
			s=L[i];
			t=R[i];
			qsum(1,n,1);
			//printf("i=%d out=%d\n",i,out);
			if(!Rev[i]){
				out=R[i]-L[i]+1-out;
				if(out){
					t=L[i]+out-1;
					x=0;
					//printf("s=%d t=%d x=%d\n",s,t,x);
					mset(1,n,1);
				}
				if(out!=R[i]-L[i]+1){
					s=t+1;
					t=R[i];
					x=1;
					//printf("s=%d t=%d x=%d\n",s,t,x);
					mset(1,n,1);
				}
			}
			else{
				if(out){
					t=L[i]+out-1;
					x=1;
					//printf("s=%d t=%d x=%d\n",s,t,x);
					mset(1,n,1);
				}
				if(out!=R[i]-L[i]+1){
					s=t+1;
					t=R[i];
					x=0;
					//printf("s=%d t=%d x=%d\n",s,t,x);
					mset(1,n,1);
				}
			}
		}
		out=0;
		s=t=p;
		qsum(1,n,1);
		//printf("%d\n",out);
		if(out)l=ans+1;
		else r=ans-1;
	}
	printf("%d",r);
#ifdef MINE
	fclose(stdin);
	fclose(stdout);
#else
	printf("\n--------------------DONE--------------------\n");
	for(;;);
#endif
	return 0;
}
void build(int l,int r,int rt){
	if(l==r){
		a[rt]=b[l]>=ans;
		//printf("%d ",a[rt]);
		return;
	}
	int mid=(l+r)>>1;
	build(lch);
	build(rch);
	a[rt]=a[rt<<1]+a[rt<<1|1];
}
void mset(int l,int r,int rt){
	if(s<=l&&t>=r){
		a[rt]=x*(r-l+1);
		lazy[rt]=x;
		return;
	}
	int mid=(l+r)>>1;
	pushdown(l,r,mid,rt);
	if(s<=mid)mset(lch);
	if(t>mid)mset(rch);
	a[rt]=a[rt<<1]+a[rt<<1|1];
}
void qsum(int l,int r,int rt){
	if(s<=l&&t>=r){
		out+=a[rt];
		return;
	}
	int mid=(l+r)>>1;
	pushdown(l,r,mid,rt);
	if(s<=mid)qsum(lch);
	if(t>mid)qsum(rch);
}
void pushdown(int l,int r,int mid,int rt){
	if(lazy[rt]==-1)return;
	int lc=rt<<1,rc=lc|1;
	lazy[lc]=lazy[rc]=lazy[rt];
	a[lc]=lazy[rt]*(mid-l+1);
	a[rc]=lazy[rt]*(r-mid);
	lazy[rt]=-1;
}