比赛 |
2025.3.29 |
评测结果 |
AAAAAAAAAA |
题目名称 |
排序 |
最终得分 |
100 |
用户昵称 |
zqy |
运行时间 |
4.894 s |
代码语言 |
C++ |
内存使用 |
5.25 MiB |
提交时间 |
2025-03-29 10:19:14 |
显示代码纯文本
#include <iostream>
#include <cstdio>
using namespace std;
const int N=1e5+10;
int n,m,num[N],a[N],l[N],r[N],b[N],op[N],q;
struct node{
int l,r,sum,tag,used;
}tr[N<<2];
void push_up(int p){
tr[p].sum=tr[p<<1].sum+tr[p<<1|1].sum;
}
void push_down(int p,int ls,int rs){
if(!tr[p].used)return;
tr[ls].tag=tr[rs].tag=tr[p].tag;
tr[ls].used=tr[rs].used=1;
tr[ls].sum=(tr[ls].r-tr[ls].l+1)*tr[p].tag;
tr[rs].sum=(tr[rs].r-tr[rs].l+1)*tr[p].tag;
tr[p].tag=0,tr[p].used=0;
return;
}
void build(int p,int l,int r){
tr[p]=node{l,r,num[l],0,0};
if(l==r)return;
int mid=(l+r)>>1;
build(p<<1,l,mid);
build(p<<1|1,mid+1,r);
push_up(p);
return;
}
void change(int p,int l,int r,int x){
if(l<=tr[p].l&&tr[p].r<=r){
tr[p].tag=x,tr[p].used=1;
tr[p].sum=(tr[p].r-tr[p].l+1)*x;
return;
}else{
push_down(p,p<<1,p<<1|1);
int mid=(tr[p].l+tr[p].r)>>1;
if(l<=mid)change(p<<1,l,r,x);
if(r>mid)change(p<<1|1,l,r,x);
push_up(p);
}
}
int ask(int p,int l,int r){
if(l<=tr[p].l&&tr[p].r<=r){
return tr[p].sum;
}else{
push_down(p,p<<1,p<<1|1);
int mid=(tr[p].l+tr[p].r)>>1,cnt=0;
if(l<=mid)cnt+=ask(p<<1,l,r);
if(r>mid)cnt+=ask(p<<1|1,l,r);
push_up(p);
return cnt;
}
}
void clear(int p,int l,int r){
tr[p]=node{0,0,0,0,0};
if(l==r)return;
int mid=(l+r)>>1;
clear(p<<1,l,mid);
clear(p<<1|1,mid+1,r);
return;
}
bool judge(int x){
for(int i=1;i<=n;i++){
num[i]=0;
if(a[i]>=x)num[i]=1;
}
build(1,1,n);
for(int i=1;i<=m;i++){
int cnt=ask(1,l[i],r[i]);
if(op[i]==0){
if(l[i]<=r[i]-cnt)change(1,l[i],r[i]-cnt,0);
if(r[i]-cnt+1<=r[i])change(1,r[i]-cnt+1,r[i],1);
}else{
if(l[i]<=l[i]+cnt-1)change(1,l[i],l[i]+cnt-1,1);
if(l[i]+cnt<=r[i])change(1,l[i]+cnt,r[i],0);
}
}
int res=ask(1,q,q);
clear(1,1,n);
if(res==1)return 1;
else return 0;
}
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",op+i,l+i,r+i);
}
scanf("%d",&q);
int L=1,R=n;
while(L<R){
int mid=(L+R+1)>>1;
if(judge(mid))L=mid;
else R=mid-1;
}
printf("%d\n",L);
return 0;
}