整体二分最后一个点MLE。
有大佬知道是为什么吗?
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+10;
struct que
{
int op,id,lb,rb,k;
};
int n,m,ind,a[N],t[N],out[N];
bool vis[N];
que q[N*3],q1[N*3],q2[N*3];
void ins(int x,int y,int z,int t1,int t2)
{
ind++;
q[ind].op=x;q[ind].id=y;
q[ind].lb=z;q[ind].rb=t1;
q[ind].k=t2;
}
void add(int x,int y)
{
for(int i=x;i<=n;i+=i&(-i))
{
t[i]+=y;
}
}
int gets(int x)
{
int ret=0;
for(int i=x;i;i-=i&(-i))
{
ret+=t[i];
}
return ret;
}
void work(int l,int r,int nl,int nr)
{
if(nl>nr||l>r)
{
return;
}
if(l==r)
{
for(int i=nl;i<=nr;i++)
{
if(q[i].op==2)
{
out[q[i].id]=l;
vis[q[i].id]=1;
}
}
return;
}
int mid=(l+r)/2,c1=0,c2=0,x;
for(int i=nl;i<=nr;i++)
{
if(q[i].op==1)
{
if(q[i].rb<=mid)
{
add(q[i].lb,q[i].k);
q1[++c1]=q[i];
}else
{
q2[++c2]=q[i];
}
}else
{
x=gets(q[i].rb)-gets(q[i].lb-1);
if(q[i].k<=x)
{
q1[++c1]=q[i];
}else
{
q[i].k-=x;
q2[++c2]=q[i];
}
}
}
for(int i=1;i<=c1;i++)
{
if(q1[i].op==1)
{
add(q1[i].lb,-q1[i].k);
}
}
for(int i=1;i<=c1;i++)
{
q[nl+i-1]=q1[i];
}
for(int i=1;i<=c2;i++)
{
q[nl+c1+i-1]=q2[i];
}
work(l,mid,nl,nl+c1-1);
work(mid+1,r,nl+c1,nr);
}
signed main()
{
int x,y,z;
char op;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>x;
a[i]=x;
ins(1,0,i,x,1);
}
for(int i=1;i<=m;i++)
{
cin>>op>>x>>y;
if(op=='C')
{
ins(1,i,x,a[x],-1);
ins(1,i,x,y,1);
a[x]=y;
}else
{
cin>>z;
ins(2,i,x,y,z);
}
}
work(-1,2e9,1,ind);
for(int i=1;i<=m;i++)
{
if(vis[i])
{
cout<<out[i]<<"\n";
}
}
}