比赛 |
2025.3.29 |
评测结果 |
AAAAAAAAAA |
题目名称 |
排序 |
最终得分 |
100 |
用户昵称 |
flyfree |
运行时间 |
4.187 s |
代码语言 |
C++ |
内存使用 |
6.54 MiB |
提交时间 |
2025-03-29 09:59:24 |
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pir pair<ll,ll>
#define ls first
#define rs second
#define mp make_pair
#define mod
#define MAXN 200010
#define qmod(x) (x>mod?x-mod:x)
#define debug cout<<"flyfreemrn\n";
// By flyfreemrn
inline ll read(){
ll x=0,f=1;
char c=getchar();
while(c<'0'||c>'9'){
if(c=='-')f=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
x=x*10+c-'0';
c=getchar();
}
return x*f;
}
struct node_sgt{
ll cnt[MAXN*4],l[MAXN*4],r[MAXN*4],tag[MAXN*4];
void build(ll lz,ll rz,ll now){
l[now]=lz,r[now]=rz;
tag[now]=-1;
if(lz==rz)return;
ll mid=(lz+rz)>>1;
build(lz,mid,now<<1);
build(mid+1,rz,now<<1|1);
}
void push_down(ll now){
if(tag[now]>-1){
cnt[now<<1]=(r[now<<1]-l[now<<1]+1)*tag[now];
cnt[now<<1|1]=(r[now<<1|1]-l[now<<1|1]+1)*tag[now];
tag[now<<1]=tag[now];
tag[now<<1|1]=tag[now];
tag[now]=-1;
}
}
void push_up(ll now){
cnt[now]=cnt[now<<1]+cnt[now<<1|1];
}
void modify(ll lz,ll rz,ll now,ll val){
// if(now==1)cout<<"modify: "<<lz<<" "<<rz<<" "<<val<<endl;
push_down(now);
if(l[now]>=lz&&r[now]<=rz){
cnt[now]=(r[now]-l[now]+1)*val;
tag[now]=val;
return;
}
ll mid=(l[now]+r[now])>>1;
if(lz<=mid)modify(lz,rz,now<<1,val);
if(rz>mid) modify(lz,rz,now<<1|1,val);
push_up(now);
}
ll get(ll lz,ll rz,ll now){
if(l[now]>=lz&&r[now]<=rz)return cnt[now];
ll mid=(l[now]+r[now])>>1,res=0;
push_down(now);
if(lz<=mid)res+=get(lz,rz,now<<1);
if(rz>mid)res+=get(lz,rz,now<<1|1);
return res;
}
}sgt;
ll a[MAXN];
ll n,m,q;
ll type[MAXN],l[MAXN],r[MAXN];
bool solve(ll p){
// cout<<p<<endl;
sgt.build(1,n,1);
// debug;
for(int i=1;i<=n;i++){
if(a[i]>=p)sgt.modify(i,i,1,1);
else sgt.modify(i,i,1,0);
}
// for(int j=1;j<=n;j++)cout<<sgt.get(j,j,1);
// cout<<endl;
// debug;
for(int i=1;i<=m;i++){
ll cnt=sgt.get(l[i],r[i],1);
// cout<<type[i]<<" "<<l[i]<<" "<<r[i]<<" "<<cnt<<endl;
if(!cnt||cnt==r[i]-l[i]+1)continue;
if(type[i]==0){
sgt.modify(l[i],r[i]-cnt,1,0);
sgt.modify(r[i]-cnt+1,r[i],1,1);
}else{
sgt.modify(l[i],l[i]+cnt-1,1,1);
sgt.modify(l[i]+cnt,r[i],1,0);
}
// for(int j=1;j<=n;j++)cout<<sgt.get(j,j,1);
// cout<<endl;
}
if(sgt.get(q,q,1))return true;
else return false;
}
int main(){
freopen("heoi2016_sort.in", "r", stdin);
freopen("heoi2016_sort.out", "w", stdout);
n=read(),m=read();
for(int i=1;i<=n;i++)a[i]=read();
for(int i=1;i<=m;i++)type[i]=read(),l[i]=read(),r[i]=read();
q=read();
ll lz=1,rz=n;
while(rz>lz){
// cout<<lz<<" "<<rz<<endl;
ll mid=(lz+rz+1)>>1;
if(solve(mid))lz=mid;
else rz=mid-1;
}
cout<<lz<<endl;
return 0;
}