#include<bits/stdc++.h>
using namespace std;
#define int long long
int read(){
int x=0,y=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-') y=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=(x<<3)+(x<<1)+(ch^48);
ch=getchar();
}
return x*y;
}
void output(int x){
if(x<0) putchar('-'),x=abs(x);
if(x>9) output(x/10);
putchar((x%10)|48);
}
int a[200001],tree[800003],n,x,y,k,lazy[800003],answer,q,l,r,d,z,sum,w,game,ls,rs,ansnumber,anss;
void add(int x){
tree[x]=tree[x*2]+tree[x*2+1];
}
void push_down(int x,int l,int r){
if(lazy[x]!=0){
lazy[x*2]+=lazy[x];
lazy[x*2+1]+=lazy[x];
int mid=(l+r)>>1;
tree[x*2]+=lazy[x]*(mid-l+1);
tree[x*2+1]+=lazy[x]*(r-mid);
lazy[x]=0;
}
}
void build(int x,int l,int r){
if(l==r){
tree[x]=a[l];
return ;
}
int mid=(l+r)>>1;
build(x*2,l,mid);
build(x*2+1,mid+1,r);
add(x);
}
void add(int s,int l,int r){
if(x<=l&&r<=y){
tree[s]+=(r-l+1)*k;
lazy[s]+=k;
return ;
}
push_down(s,l,r);
int mid=(l+r)>>1;
if(x<=mid) add(s*2,l,mid);
if(y>mid) add(s*2+1,mid+1,r);
add(s);
}
void ans(int id,int l,int r){
if(x<=l&&r<=y){
ansnumber+=tree[id];
return ;
}
push_down(id,l,r);
int mid=(l+r)>>1;
if(mid>=x) ans(id*2,l,mid);
if(mid<y) ans(id*2+1,mid+1,r);
}
signed main(){
n=read();
q=read();
w=read();
for(int i=1;i<=n;i++){
a[i]=read();
sum+=a[i];
}
build(1,1,n);
while(q--){
answer=0;
x=read();
y=read();
k=read();
add(1,1,n);
sum+=(y-x+1)*k;
z=w/sum;
z++;
z=floor(log2(z));
answer+=z*n;
z=pow(2,z)-1;
game=w-(sum*z);
if(game==0){
answer--;
}
anss=0,ls=1,rs=n-1;
z++;
x=1;
while(ls<=rs){
y=(ls+rs)>>1;
ansnumber=0;
ans(1,1,n);
if((long long)z*ansnumber<game){
anss=y;
ls=y+1;
}
else{
rs=y-1;
}
}
output(answer+anss);
puts("");
}
return 0;
}
为什么线段树 O(q log n) 被卡 TLE 了。
调了 3.5h 的代码 70 ......