蒟蒻代码:
#include<iostream>
#define ls x<<1
#define rs x<<1|1
using namespace std;
int n,m,q,in[100005];
struct tree
{
int l,r,s;
bool tag,tagb;
}a[400005];
struct in
{
int l,r;
bool op;
}b[100005];
void pushup(int x){a[x].s=a[ls].s+a[rs].s;}
void pushdown(int x)
{
if(a[x].tagb)
{
a[ls].s=a[x].tag*(a[ls].r-a[ls].l+1);
a[rs].s=a[x].tag*(a[rs].r-a[rs].l+1);
a[ls].tag=a[rs].tag=a[x].tag;
a[ls].tagb=a[rs].tagb=1;
a[x].tagb=0;
}
}
void build(int x,int l,int r)
{
a[x].l=l,a[x].r=r;
if(l==r)return;
int mid=(l+r)>>1;
build(ls,l,mid);
build(rs,mid+1,r);
}
void build1(int k,int x)
{
a[x].tagb=0;
if(a[x].l==a[x].r)
{
a[x].s=(in[x]>=k);
return;
}
build1(k,ls);
build1(k,rs);
pushup(x);
}
void add(int x,int l,int r,bool ad)
{
if(l<=a[x].l&&r>=a[x].r)
{
a[x].s=ad*(a[x].r-a[x].l+1);
a[x].tag=ad;
a[x].tagb=1;
return;
}
pushdown(x);
if(l<=a[ls].r)add(ls,l,r,ad);
if(r>=a[rs].l)add(rs,l,r,ad);
pushup(x);
}
int query(int x,int l,int r)
{
if(l<=a[x].l&&r>=a[x].r)return a[x].s;
pushdown(x);
int ans=0;
if(l<=a[ls].r)ans+=query(ls,l,r);
if(r>=a[rs].l)ans+=query(rs,l,r);
return ans;
}
bool find(int x)
{
build1(x,1);
for(int i=1;i<=m;i++)
{
int num=query(1,b[i].l,b[i].r);
if(b[i].op)
{
add(1,b[i].l,b[i].l+num-1,1);
add(1,b[i].l+num,b[i].r,0);
}
else
{
add(1,b[i].r-num+1,b[i].r,1);
add(1,b[i].l,b[i].r-num,0);
}
}
return query(1,q,q);
}
int main()
{
cin>>n>>m;
build(1,1,n);
for(int i=1;i<=n;i++)cin>>in[i];
for(int i=1;i<=m;i++)cin>>b[i].op>>b[i].l>>b[i].r;
cin>>q;
int l=1,r=n,ans;
while(l<=r)
{
int mid=(l+r)>>1;
if(find(mid))
{
l=mid+1;
ans=mid;
}
else r=mid-1;
}
cout<<ans;
return 0;
}