#include<bits/stdc++.h>
using namespace std;
const int N=4e6+10;
int a[N];
struct tree{
int d[N],b[N],x;
void build(int s,int t,int p){
b[p]=-1;if(s==t){d[p]=(int)(a[s]>=x);return ;}
int m=s+((t-s)>>1);
build(s,m,p*2),build(m+1,t,p*2+1);
d[p]=d[p*2]+d[p*2+1];
}
void update(int l,int r,int c,int s,int t,int p){
if(l<=s&&t<=r){d[p]=(t-s+1)*c,b[p]=c;return;}
if(t<l||s>r)return ;
int m=s+((t-s>>1));
if(b[p]!=-1){
d[p*2]=b[p]*(m-s+1),b[p*2]=b[p];
d[p*2+1]=b[p]*(t-m),b[p*2+1]=b[p];
b[p]=-1;
}
if(l<=m)update(l,r,c,s,m,p*2);
if(m<r) update(l,r,c,m+1,t,p*2+1);
d[p]=d[p*2]+d[p*2+1];
}
int getans(int l,int r,int s,int t,int p){
if(l<=s&&t<=r)return d[p];
int m=s+((t-s>>1)),ans=0;
if(b[p]!=-1){
d[p*2]=b[p]*(m-s+1),b[p*2]=b[p];
d[p*2+1]=b[p]*(t-m),b[p*2+1]=b[p];
b[p]=-1;
}
if(l<=m)ans+=getans(l,r,s,m,p*2);
if(m<r) ans+=getans(l,r,m+1,t,p*2+1);
return ans;
}
}T;
int l[N],r[N],op[N],n,m,q,ans=0;
bool check(int x){
T.x=x,T.build(1,n,1);
for(int i=1;i<=m;i++){
int sum=T.getans(l[i],r[i],1,n,1);
if(op[i]==0){
T.update(r[i]-sum+1,r[i],1,1,n,1);
T.update(l[i],r[i]-sum,0,1,n,1);
}
else{
T.update(l[i],l[i]-sum-1,1,1,n,1);
T.update(l[i]+sum,r[i],0,1,n,1);
}
}
return T.getans(q,q,1,n,1);
}
int main(){
cin>>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]);
cin>>q;int l1=1,r1=n;
while(l1<=r1){
int mid=((l1+r1)>>1);
if(check(mid))ans=max(mid,ans),l1=mid+1;
else r1=mid-1;
}
printf("%d",ans);
return 0;
}
样例过了 WA0%