记录编号 |
433388 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[HEOI 2016] 排序 |
最终得分 |
100 |
用户昵称 |
yymxw |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
5.856 s |
提交时间 |
2017-08-05 11:20:25 |
内存使用 |
4.99 MiB |
显示代码纯文本
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
inline int read()
{
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=(x<<3)+(x<<1)+ch-'0';
ch=getchar();
}
return x*f;
}
struct node
{
int k,l,r;
};
node q[100010];
int n,m,x,k,y,zuida=0,ying;
int a[100010],add[400010],sum[400010];
bool flag[100010];
void pushup(int i)
{
sum[i]=sum[2*i]+sum[2*i+1];
return ;
}
void build(int l,int r,int i)
{
add[i]=-1;
if(l==r)
{
sum[i]=flag[l];
return ;
}
int mid=(l+r)>>1;
build(l,mid,2*i);
build(mid+1,r,2*i+1);
pushup(i);
}
void pushdown(int i,int len)
{
if(add[i]!=-1)
{
add[2*i]=add[i];
add[2*i+1]=add[i];
sum[2*i]=add[i]*(len-len/2);
sum[2*i+1]=add[i]*len/2;
add[i]=-1;
}
}
void update(int L,int R,int c,int l,int r,int i)
{
if(L>R) return ;
if(L<=l&&r<=R)
{
add[i]=c;
sum[i]=c*(r-l+1);
return ;
}
pushdown(i,r-l+1);
int mid=(l+r)>>1;
if(L<=mid)
update(L,R,c,l,mid,2*i);
if(mid<R)
update(L,R,c,mid+1,r,2*i+1);
pushup(i);
}
int query(int L,int R,int l,int r,int i)
{
if(L<=l&&r<=R)
return sum[i];
pushdown(i,r-l+1);
int mid=(l+r)>>1;
int ans=0;
if(L<=mid)
ans+=query(L,R,l,mid,2*i);
if(mid<R)
ans+=query(L,R,mid+1,r,2*i+1);
return ans;
}
bool check(int x)
{
for(int i=1;i<=n;++i)
flag[i]=(a[i]<x);
build(1,n,1);
for(int i=1;i<=m;++i)
{
int shu=query(q[i].l,q[i].r,1,n,1);
if(q[i].k==0)
{
update(q[i].l,q[i].l+shu-1,1,1,n,1);
update(q[i].l+shu,q[i].r,0,1,n,1);
}
if(q[i].k==1)
{ //cout<<53135;
update(q[i].l,q[i].r-shu,0,1,n,1);
update(q[i].r-shu+1,q[i].r,1,1,n,1);
}
}
if(query(ying,ying,1,n,1)==0) return 1;
return 0;
}
int main()
{
freopen("heoi2016_sort.in","r",stdin);
freopen("heoi2016_sort.out","w",stdout);
n=read();m=read();
build(1,n,1);
for(int i=1;i<=n;++i)
{
a[i]=read();
if(a[i]>zuida)
zuida=a[i];
}
for(int i=1;i<=m;++i)
{
q[i].k=read();q[i].l=read();q[i].r=read();
}
int l=0,r=zuida+1,mid;
ying=read();
while(l<=r)
{
//memset(flag,0,sizeof(flag));
mid=(l+r)>>1;
if(check(mid))
l=mid+1;
else
r=mid-1;
//cout<<"l="<<l<<" "<<"r="<<r<<endl;
}
printf("%d",r);
return 0;
}