比赛 |
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;
}