真不知道错哪了 调了好久 check(6) 的值一直是 1
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define il inline
#define mid (l+r>>1)
#define ls fa<<1
#define rs fa<<1|1
const int maxn=1e5+5;
int n, m, q, ll=1, rr, op, ans, cnt;
int a[maxn], tr[maxn<<4], lazy[maxn<<4];
struct node{
int op, pl, pr;
}make[maxn];
il int read()
{
int num=0, f=1;
char c=getchar();
while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();}
while(c>='0'&&c<='9') {num=(num<<3)+(num<<1)+(c^48);c=getchar();}
return num*f;
}
il void build(int fa,int l,int r,int x)
{
lazy[fa]=0;
if(l==r)
{
tr[fa]=(a[l]>=x);
return;
}
build(ls,l,mid,x);
build(rs,mid+1,r,x);
tr[fa]=tr[ls]+tr[rs];
return;
}
il void down(int fa,int l,int r)
{
if (!lazy[fa]) return;
lazy[ls]=lazy[rs]=lazy[fa];
if (lazy[fa]==1){
tr[ls]=mid-l+1;
tr[rs]=r-mid;
}
else tr[ls]=tr[rs]=0;
lazy[fa]=0;
}
il int query(int fa,int l,int r,int ql,int qr)
{
if(ql<=l&&qr>=r) return tr[fa];
if(ql>r||qr<l) return 0;
down(fa,l,r);
return query(ls,l,mid,ql,qr)+query(rs,mid+1,r,ql,qr);
}
il void chang(int fa,int l,int r,int ql,int qr,int x)
{
if(ql<=l&&qr>=r)
{
lazy[fa]=x?1:-1;
tr[fa]+=x*(r-l+1);
return;
}
down(fa,l,r);
if(ql<=mid) chang(ls,l,mid,ql,qr,x);
if(qr>mid) chang(rs,mid+1,r,ql,qr,x);
tr[fa]=tr[ls]+tr[rs];
}
il bool check(int x)
{
build(1,1,n,x);
for(int i=1;i<=m;i++)
{
int sum=query(1,1,n,make[i].pl,make[i].pr);
if(sum==0) chang(1,1,n,make[i].pl,make[i].pr,0);
else if(sum==make[i].pr-make[i].pl+1) chang(1,1,n,make[i].pl,make[i].pr,1);
else
{
if(make[i].op==0)
{
chang(1,1,n,make[i].pr-sum+1,make[i].pr,1);
chang(1,1,n,make[i].pl,make[i].pr-sum,0);
}
else
{
chang(1,1,n,make[i].pl,make[i].pl+sum-1,1);
chang(1,1,n,make[i].pl+sum,make[i].pr,0);
}
}
}
return query(1,1,n,q,q);
}
signed main()
{
n=read();m=read();
for(int i=1;i<=n;i++) a[i]=read();
for(int i=1;i<=m;i++)
{
make[i].op=read();
make[i].pl=read();
make[i].pr=read();
}
q=read();
rr=n;
while(ll<=rr)
{
cnt=(ll+rr)>>1;
if(check(cnt))
{ a
ans=cnt;
ll=cnt+1;
}
else rr=cnt-1;
}
printf("%d",ans);
return 0;
}