rt,线段树+二分,求大佬调
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define int ll
#define ls rt<<1
#define rs rt<<1|1
const int N=1e5+7;
const int inf=1e18;
int n,m,p,a[N];
struct ask{int op,l,r;}q[N];
struct tree{int x,lazy;}t[N<<2];
inline void pushup(int rt){t[rt].x=t[ls].x+t[rs].x;return;}
inline void addlazy(int rt,int l,int r,int C){
t[rt].x=(r-l+1)*C;
t[rt].lazy=C;
return;
}
inline void pushdown(int l,int r,int rt){
int mid=(l+r)/2;
if(t[rt].lazy){
addlazy(ls,l,mid,t[rt].lazy);
addlazy(rs,mid+1,r,t[rt].lazy);
t[rt].lazy=0;
}
}
inline void build(int l,int r,int rt,int C){
t[rt].lazy=0;
if(l==r){
t[rt].x=(a[l]>=C);
return;
}
int mid=(l+r)/2;
build(l,mid,ls,C);
build(mid+1,r,rs,C);
pushup(rt);
}
inline void update(int L,int R,int C,int l,int r,int rt){
if(L<=l&&r<=R){
addlazy(rt,l,r,C);
return;
}
int mid=(l+r)/2;
pushdown(l,r,rt);
if(L<=mid)update(L,R,C,l,mid,ls);
if(R>mid)update(L,R,C,mid+1,r,rs);
pushup(rt);
}
inline int query(int L,int R,int l,int r,int rt){
if(L>r||l>R)return 0;
if(L<=l&&r<=R)return t[rt].x;
int mid=(l+r)/2;
pushdown(l,r,rt);
return query(L,R,l,mid,ls)+query(L,R,mid+1,r,rs);
}
inline bool f(int x){
build(1,n,1,x);
for(int i=1;i<=m;i++){
int L=q[i].l,R=q[i].r;
int tmp=query(L,R,1,n,1);
if(q[i].op==0){
update(R-tmp+1,R,1,1,n,1);
update(L,R-tmp,0,1,n,1);
}else{
update(L,L+tmp-1,1,1,n,1);
update(L+tmp,R,0,1,n,1);
}
}
return query(p,p,1,n,1);
}
inline int solve(){
int l=1,r=n,ans=0;
while(l<=r){
int mid=(l+r)/2;
if(f(mid))ans=mid,l=mid+1;
else r=mid-1;
}
return ans;
}
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=m;i++)cin>>q[i].op>>q[i].l>>q[i].r;
cin>>p;
cout<<solve()<<"\n";
}