一直爆,到底是为什么,貌似是updata的问题
#include<iostream>
#include<cstdio>
using namespace std;
const int N=1e5+10;
int n,m,p,a[N],sign[N],L[N],R[N],ans,g[N>>2],lazy[N>>2];
inline int read()
{
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();
return x*f;
}
void build(int x,int l,int r,int tot)
{
if(l==r)
{
g[x]=(a[l]>=tot);
lazy[x]=0;
return;
}
int mid=(l+r)>>1;
build(x<<1,l,mid,tot);
build(x<<1|1,mid+1,r,tot);
g[x]=g[x<<1]+g[x<<1|1],lazy[x]=0;
}
void pushdown(int x,int l,int r,int mid)
{
if(!lazy[x])return;
lazy[x<<1]=lazy[x<<1|1]=lazy[x];
if(lazy[x]==1)g[x<<1]=mid-l+1,g[x<<1|1]=r-mid;
else g[x<<1]=g[x<<1|1]=0;
lazy[x]=0;
}
int query(int x,int l,int r,int ql,int qr)
{
if(ql==l&&r==qr)return g[x];
int mid=(l+r)>>1;
pushdown(x,l,r,mid);
if(ql<=mid&&qr>mid)return query(x<<1,l,mid,ql,mid)+query(x<<1|1,mid+1,r,mid+1,qr);
else if(qr<=mid)return query(x<<1,l,mid,ql,qr);
else return query(x<<1|1,mid+1,r,ql,qr);
}
void updata(int x,int l,int r,int ql,int qr,int val)
{
if(ql==l&&r==qr)
{
g[x]=(r-l+1)*val;lazy[x]=val?1:-1;
return;
}
int mid=(l+r)>>1;
pushdown(x,l,r,mid);
if(ql<=mid&&qr>mid)
{
updata(x<<1,l,mid,ql,mid,val);
updata(x<<1|1,mid+1,r,mid+1,qr,val);
}
else if(qr<=mid)updata(x<<1,l,mid,ql,qr,val);
else updata(x<<1|1,mid+1,r,ql,qr,val);
g[x]=g[x<<1]+g[x<<1|1];
}
int check(int x)
{
build(1,1,n,x);
for(int i=1;i<=m;i++)
{
int l=L[i],r=R[i];int tot=query(1,1,n,l,r);
if(sign[x]==0)
{
updata(1,1,n,l,r-tot,0);
updata(1,1,n,r-tot+1,r,1);
}
else
{
updata(1,1,n,l,l+tot-1,1);
updata(1,1,n,l+tot,r,0);
}
}
return query(1,1,n,p,p);
}
int main()
{
n=read(),m=read();
for(int i=1;i<=n;i++)a[i]=read();
for(int i=1;i<=m;i++)sign[i]=read(),L[i]=read(),R[i]=read();
p=read();
int ll = 1, rr = n, midd;
while(ll<=rr){
midd=(ll+rr)>>1;
if(check(midd))ans=midd,ll=midd+1;else rr=midd-1;
}
printf("%d",ans);
return 0;
}