比赛 2025.3.29 评测结果 AAAAAAAAAA
题目名称 排序 最终得分 100
用户昵称 李金泽 运行时间 5.209 s
代码语言 C++ 内存使用 2.60 MiB
提交时间 2025-03-29 11:27:25
显示代码纯文本
#include<cstdio>
#define N 100005
#define ls(x) x<<1
#define rs(x) x<<1|1
using namespace std;
int n,m,q,a[N],t0[N<<2],t1[N<<2],tag[N<<2],op[N],ll[N],rr[N],l=1,r,mid,x,y;
void pu(int x){t0[x]=t0[ls(x)]+t0[rs(x)],t1[x]=t1[ls(x)]+t1[rs(x)];}
void ad(int l,int r,int x,int k){if(k==1)t0[x]=r-l+1,t1[x]=0;else t0[x]=0,t1[x]=r-l+1;tag[x]=k;}
void pd(int l,int r,int x){if(tag[x]){int mid=l+r>>1;ad(l,mid,ls(x),tag[x]);ad(mid+1,r,rs(x),tag[x]);tag[x]=0;}}
void ud(int l,int r,int sl,int sr,int x,int k)
{
	if(sl<=l&&r<=sr){ad(l,r,x,k);return;}
	pd(l,r,x);
	int mid=l+r>>1;
	if(sl<=mid)ud(l,mid,sl,sr,ls(x),k);
	if(mid<sr)ud(mid+1,r,sl,sr,rs(x),k);
	pu(x);
}
void gs(int l,int r,int sl,int sr,int x,int &s0,int &s1)
{
	if(sl<=l&&r<=sr){s0=t0[x],s1=t1[x];return;}
	pd(l,r,x);
	int mid=l+r>>1,a0=0,a1=0;s0=s1=0;
	if(sl<=mid)gs(l,mid,sl,sr,ls(x),s0,s1);
	if(mid<sr)gs(mid+1,r,sl,sr,rs(x),a0,a1);
	s0+=a0,s1+=a1;
}
void bd(int l,int r,int x)
{
	tag[x]=0;
	if(l==r){if(a[l]<mid)t0[x]=1,t1[x]=0;else t0[x]=0,t1[x]=1;return;}
	int mid=l+r>>1;
	bd(l,mid,ls(x));bd(mid+1,r,rs(x));
	pu(x);
}
bool check()
{
	bd(1,n,1);
	for(int i=1;i<=m;i++)
	{
		gs(1,n,ll[i],rr[i],1,x,y);
		if(op[i]){if(y)ud(1,n,ll[i],ll[i]+y-1,1,2);if(x)ud(1,n,rr[i]-x+1,rr[i],1,1);}
		else{if(x)ud(1,n,ll[i],ll[i]+x-1,1,1);if(y)ud(1,n,rr[i]-y+1,rr[i],1,2);}
	}
	gs(1,n,q,q,1,x,y);
	return y;
}
int read()
{
	int sum=0;bool f=0;char c=getchar();
	while(c<48||c>57){if(c==45)f=1;c=getchar();}
	while(c>=48&&c<=57)sum=sum*10+(c-48),c=getchar();
	return f?-sum:sum;
}
int main()
{
    freopen("heoi2016_sort.in","r",stdin);freopen("heoi2016_sort.out","w",stdout);
	n=r=read(),m=read();
	for(int i=1;i<=n;i++)a[i]=read();
	for(int i=1;i<=m;i++)op[i]=read(),ll[i]=read(),rr[i]=read();
	q=read();
	while(l<r)
	{
		mid=l+r+1>>1;
		if(check())l=mid;
		else r=mid-1;
	}
	printf("%d",l);
	return 0;
}