#include<bits/stdc++.h>
using namespace std;
#define pl (p<<1)
#define pr (p<<1|1)
const int N=1e5+10;
int n,m,p,l,r,mid,a[N],op[N],L[N],R[N];
struct Tree{int sum,cov;}tr[N<<2];
void push_down(int l,int mid,int r,int p){tr[pl].cov=tr[pr].cov=tr[p].cov,tr[pl].sum=(tr[p].cov==1?mid-l+1:0),(tr[pr].sum=tr[p].cov==1?r-mid:0),tr[p].cov=0;}
void push_up(int p){tr[p].sum=tr[pl].sum+tr[pr].sum;}
void update(int l,int r,int le,int ri,int v,int p){
if(l>=le&&r<=ri)return tr[p].cov=(v?1:-1),tr[p].sum=v*(r-l+1),void();
int mid=l+r>>1;push_down(l,mid,r,p);
if(le<=mid)update(l,mid,le,ri,v,pl);
if(ri>mid)update(mid+1,r,le,ri,v,pr);
push_up(p);
}int query(int l,int r,int le,int ri,int p){
if(l>=le&&r<=ri)return tr[p].sum;
int mid=l+r>>1,ret=0;push_down(l,mid,r,p);
if(le<=mid)ret+=query(l,mid,le,ri,pl);
if(ri>mid)ret+=query(mid+1,r,le,ri,pr);
return ret;
}void build(int k,int l,int r,int p){
if(l==r)return tr[p].sum=(a[l]>=k),tr[p].cov=0,void();
int mid=l+r>>1;
build(k,l,mid,pl),build(k,mid+1,r,pr),push_up(p),tr[p].cov=0;
}bool check(int x){
build(x,1,n,1);
for(int i=1;i<=m;i++){
int c=query(1,n,L[i],R[i],1);
if(op[i])update(1,n,L[i],L[i]+c-1,1,1),update(1,n,L[i]+c,R[i],1,0);
else update(1,n,R[i]-c+1,R[i],1,1),update(1,n,L[i],R[i]-c,1,0);
}return query(1,n,p,p,1);
}int main(){
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=m;i++)cin>>op[i]>>L[i]>>R[i];
cin>>p;
for(l=1,r=n;l+1<r;check(mid=l+r>>1)?l=mid:r=mid);
cout<<l;
return 0;
}