#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read() {int x=0,f=1; char ch=getchar();while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar();}while(ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();return x*f;}
int n,m,a[500005],sum[500005],b[500005],x,y,num;
int lazy[500005];
struct node{
int opt,ll,rr;
} in[100005];
void push_down(int rt,int l,int r){
if(~lazy[rt]){
int mid=r+l>>1;
sum[rt<<1]=(mid-l+1)*lazy[rt];
lazy[rt<<1]=lazy[rt];
sum[rt<<1|1]=(r-mid+1)*lazy[rt];
lazy[rt<<1|1]=lazy[rt];
lazy[rt]=-1;
}
}
void push_up(int rt){
sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}
void build(int rt,int l,int r){
if(l==r){
sum[rt]=a[r];
return;
}
int m=r+l>>1;
build(rt<<1,l,m);
build(rt<<1|1,m+1,r);
push_up(rt);
}
void update(int rt,int l,int r,int ll,int rr,int val){
if(rr<r||ll>l){
return;
}
if(ll<=l&&rr>=r){
sum[rt]=(r-l+1)*val;
lazy[rt]=val;
return;
}
int mid=r+l>>1;
push_down(rt,l,r);
if(ll<=mid) update(rt<<1,l,mid,ll,rr,val);
if(mid<rr) update(rt<<1|1,mid+1,r,ll,rr,val);
push_up(rt);
}
int query(int rt,int l,int r,int ll,int rr){
if(ll<=l&&rr>=r){
return sum[rt];
}
push_down(rt,l,r);
int m=r+l>>1;
int res=0;
if(ll<=m) res+=query(rt<<1,l,m,ll,rr);
if(rr>m) res+=query(rt<<1|1,m+1,r,ll,rr);
return res;
}
signed main(){
n=read(),m=read();
for(int i=1;i<=n;i++){
b[i]=read();
}
memset(lazy,-1,sizeof(lazy));
for(int i=1;i<=m;i++) in[i].opt=read(),in[i].ll=read(),in[i].rr=read();
int WANT=read();
int l=1,r=n,ans;
while(l<=r){
int mid=r+l>>1;
for(int i=1;i<=n;i++){
if(b[i]>=mid) a[i]=1;
else a[i]=0;
}
build(1,1,n);
for(int i=1;i<=m;i++){
int nowl=in[i].ll,nowr=in[i].rr;
int ones=query(1,1,n,nowl,nowr);
int zeros=nowr-nowl+1-ones;
int cnt1=query(1,1,n,nowl,nowr);
if(in[i].opt==1){
update(1,1,n,l,l+ones-1,1);
update(1,1,n,l+ones,r,0);
}
else{
update(1,1,n,l,l+zeros-1,0);
update(1,1,n,l+zeros,r,1);
}
}
if(query(1,1,n,WANT,WANT)==1) {
ans=mid;
l=mid+1;
}
else r=mid-1;
}
cout<<ans<<endl;
}