#include<bits/stdc++.h>
using namespace std;
#define int long long
#define N 100010
int n,m,a[N],q;
struct questions
{
int op,l,r;
}ques[N];
struct st
{
int l,r,cnt1,tag;
#define l(x) tree[x].l
#define r(x) tree[x].r
#define cnt1(x) tree[x].cnt1
#define tag(x) tree[x].tag
#define len(x) (tree[x].r-tree[x].l+1)
}tree[N<<2];
void change(int p)
{
cnt1(p)=cnt1(p*2)+cnt1(p*2+1);
}
void spread(int p)
{
if(tag(p))
{
tag(p*2)=tag(p*2+1)=tag(p);
if(tag(p)==1)
{
cnt1(p*2)=len(p*2);
cnt1(p*2+1)=len(p*2+1);
}
else cnt1(p*2)=cnt1(p*2+1)=0;
tag(p)=0;
}
}
void build(int p,int l,int r,int now)
{
l(p)=l,r(p)=r;
if(l==r)
{
if(a[l]>=now) cnt1(p)=1;
return ;
}
int mid=(l+r)/2;
build(p*2,l,mid,now);
build(p*2+1,mid+1,r,now);
change(p);
}
void add(int p,int l,int r,int v)
{
if(l<=l(p)&&r(p)<=r)
{
cnt1(p)=v*len(p);
tag(p)=v?1:-1;
return;
}
spread(p);
int mid=(l(p)+r(p))/2;
if(l<=mid)add(p*2,l,r,v);
if(r>mid) add(p*2+1,l,r,v);
change(p);
}
int ask(int p,int l,int r)
{
int ans=0;
if(l<=l(p)&&r(p)<=r)
return cnt1(p);
spread(p);
int mid=(l(p)+r(p))/2;
if(l<=mid)ans+=ask(p*2,l,r);
if(r>mid) ans+=ask(p*2+1,l,r);
return ans;
change(p);
}
bool check(int x)
{
build(1,1,n,x);
for(int i=1;i<=m;i++)
{
int L=ques[i].l,R=ques[i].r,op=ques[i].op;
int cnt=ask(1,L,R);
if(op==0)
{
add(1,L,R-cnt,0);
add(1,R-cnt+1,R,1);
}
else{
add(1,L,L+cnt-1,1);
add(1,L+cnt,R,0);
}
}
return ask(1,q,q);
}
signed main()
{
freopen("sort.in","r",stdin);
freopen("sort.out","w",stdout);
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<=m;i++)
cin>>ques[i].op>>ques[i].l>>ques[i].r;
cin>>q;
int l=1,r=n;
while(l+1<r)
{
int mid=(l+r)/2;
if(check(mid))l=mid;
else r=mid;
}
if(check(l))cout<<l;
else cout<<r;
return 0;
}