#include #include #include #include #include using namespace std; int n,m,k; const int MAXN = 100010; int a[MAXN],b[MAXN]; struct Opt { int typ,l,r; void read() { scanf("%d%d%d",&typ,&l,&r); } } opt[MAXN]; struct Node { int l,r,sum,tag; } seg[MAXN << 2]; void Build(int x,int l,int r) { seg[x].l =l ,seg[x].r = r,seg[x].tag = -1 ; if (l == r) { seg[x].sum = b[l]; return ; } int mid = (l + r) >> 1; Build(x << 1,l,mid); Build((x << 1) + 1,mid + 1,r); seg[x].sum = seg[x << 1].sum + seg[(x << 1) + 1].sum; } void pushdown(int x) { if (seg[x].tag >= 0) { int tg = seg[x].tag; seg[x].tag = -1; seg[x << 1].tag = tg,seg[x << 1].sum = tg ? (seg[x << 1].r - seg[x << 1].l + 1) : 0; seg[(x << 1) + 1].tag = tg,seg[(x << 1) + 1].sum = tg ? (seg[(x << 1) + 1].r - seg[(x << 1) + 1].l + 1) : 0; } } void Modify(int x,int l,int r,int v) { if (seg[x].l == l && seg[x].r == r) { seg[x].tag = v; seg[x].sum = v ? (seg[x].r - seg[x].l + 1) : 0; return ; } pushdown(x); int mid = (seg[x].l + seg[x].r) >> 1; if (r <= mid) Modify(x << 1,l,r,v); else if (l > mid) Modify((x << 1) + 1,l,r,v); else Modify(x << 1,l,mid,v),Modify((x << 1) + 1,mid + 1,r,v); seg[x].sum = seg[x << 1].sum + seg[(x << 1) + 1].sum; } int Query(int x,int l,int r) { if (seg[x].l == l && seg[x].r == r) return seg[x].sum; pushdown(x); int mid = (seg[x].l + seg[x].r) >> 1; if (r <= mid) return Query(x << 1,l,r); else if (l > mid) return Query((x << 1) + 1,l,r); return Query(x << 1,l,mid) + Query((x << 1) + 1,mid + 1,r); } bool check(int x) { for (int i = 1;i <= n;i ++) { if (a[i] >= x) b[i] = 1; else b[i] = 0; } Build(1,1,n); for (int i = 1;i <= m;i ++) { if (opt[i].typ == 0) { int S = Query(1,opt[i].l,opt[i].r); Modify(1,opt[i].l,opt[i].r,0); if (S) Modify(1,opt[i].r - S + 1,opt[i].r,1); } else { int S = Query(1,opt[i].l,opt[i].r); Modify(1,opt[i].l,opt[i].r,0); if (S) Modify(1,opt[i].l,opt[i].l + S - 1,1); } } return Query(1,k,k) == 1; } int main() { int T; scanf("%d",&T); while (T --) { scanf("%d%d",&n,&m); for (int i = 1;i <= n;i ++) scanf("%d",&a[i]); for (int i = 1;i <= m;i ++) opt[i].read(); scanf("%d",&k); int l = 1,r = n; while (l < r) { int mid = ((l + r) >> 1) + 1; if (check(mid)) l = mid; else r = mid - 1; } printf("%d\n",l); } }