rt,15-20subtask能过,且只用了11mb,11-14不明原因MLE,怀疑栈溢出,但认为代码没有问题,求大佬调试/解释
#include<bits/stdc++.h>
using namespace std;
const int MAXN=2e5+5;
int n,a[MAXN];
struct yrd{
long long val,laz;
}tree[4*MAXN];
void push_up(int rt){
tree[rt].val=tree[rt*2].val+tree[rt*2+1].val;
return;
}
void push_down(int rt,int nl,int nr){
tree[rt*2].val+=nl*tree[rt].laz;
tree[rt*2+1].val+=nr*tree[rt].laz;
tree[rt*2].laz+=tree[rt].laz;
tree[rt*2+1].laz+=tree[rt].laz;
tree[rt].laz=0;
return;
}
void build(int l,int r,int rt){
if (l==r){
tree[rt].val=a[l];
tree[rt].laz=0;
return;
}
tree[rt].laz=0;
int mid=(l+r)/2;
build(l,mid,rt*2);
build(mid+1,r,rt*2+1);
push_up(rt);
return;
}
void add(int l,int r,int rt,int ql,int qr,int w){
if (ql>r || qr<l){
return;
}
if (ql<=l && qr>=r){
tree[rt].val+=(r-l+1)*w;
tree[rt].laz+=w;
return;
}
int mid=(l+r)/2;
push_down(rt,mid-l+1,r-mid);
add(l,mid,rt*2,ql,qr,w);
add(mid+1,r,rt*2+1,ql,qr,w);
push_up(rt);
return;
}
int qs(int l,int r,int rt,long long s,int tw){
if (l==r){
if (s<=0){
return 0;
}
return 1;
}
int mid=(l+r)/2;
push_down(rt,mid-l+1,r-mid);
if (tree[rt*2].val*tw<s){
s-=tree[rt*2].val*tw;
return mid-l+1+qs(mid+1,r,rt*2+1,s,tw);
}else if (tree[rt*2].val*tw==s){
return mid-l;
}else{
return qs(l,mid,rt*2,s,tw);
}
}
int query(long long s,int tw){
if (tree[1].val*tw<s){
return query(s-tree[1].val*tw,tw*2)+n;
}
return qs(1,n,1,s,tw);
}
int main(){
int q;
long long W;
scanf("%d%d%lld",&n,&q,&W);
for (int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
build(1,n,1);
int l,r;
long long d;
for (int i=1;i<=q;i++){
scanf("%d%d%lld",&l,&r,&d);
add(1,n,1,l,r,d);
printf("%d\n",query(W,1)-1);
}
return 0;
}