线段树0pts求助
查看原帖
线段树0pts求助
661913
liwenxi1145144444楼主2024/10/20 18:39
#include<bits/stdc++.h>
#define int long long
#define ls x<<1
#define rs x<<1|1 
#define qmi int mid=(tree[x].l+tree[x].r)>>1
using namespace std;
int n,q,w,a[200005],sum;
struct node{
	int l,r,sum,lasy;
}tree[800005];
inline void push_up(int x){
	tree[x].sum=tree[ls].sum+tree[rs].sum;
	return ;
}
inline void push_down(int x){
	if(tree[x].lasy){
		tree[ls].sum+=(tree[ls].r-tree[ls].l+1)*tree[x].lasy;
		tree[rs].sum+=(tree[rs].r-tree[rs].l+1)*tree[x].lasy;
		tree[ls].lasy+=tree[x].lasy;
		tree[rs].lasy=tree[x].lasy;
		tree[x].lasy=0;
	}
	return ;
}
inline void build(int x,int l,int r){
	tree[x].l=l;
	tree[x].r=r;
	if(l==r){
		tree[x].sum=a[l];
		return ;
	}
	qmi;
	build(ls,l,mid);
	build(rs,mid+1,r);
	push_up(x);
	return ;
}
inline void update(int x,int l,int r,int d){
	if(tree[x].l>=l&&tree[x].r<=r){
		tree[x].sum+=(tree[x].r-tree[x].l+1)*d;
		tree[x].lasy+=d;
		return ;
	}
	push_down(x);
	qmi;
	if(l<=mid){
		update(ls,l,r,d);
	}
	if(r>mid){
		update(rs,l,r,d);
	}
	push_up(x);
}
inline int query(int x,int l,int r){
	if(tree[x].l>=l&&tree[x].r<=r){
		return tree[x].sum;
	}
	push_down(x);
	int ans=0;
	qmi;
	if(l<=mid){
		ans+=query(ls,l,r);
	}
	if(r>mid){
		ans+=query(rs,l,r);
	}
	return ans;
}
inline int pw(int x,int p){
	int ans=1;
	while(p){
		if(p%2==1){
			if(w/ans<x){
				return -1;
			}
			ans*=x;
		}
		p>>=1;
		if(p>0&&w/x<x){
			return -1;
		}
		x*=x;
	}
	return ans;
}
inline int read() {
	int x = 0,f = 1;char v = getchar();
	while (!isdigit(v)) {if (v =='-') f = -1;v = getchar();}
	while (isdigit(v)) {x = x * 10 + v - 48;v = getchar();}
	return x * f;
}
signed main(){
// 	freopen("wxyt2.in","r",stdin);
	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--){
		int ll,rr,d,ans=0;
		ll=read();
		rr=read();
		d=read();
		update(1,ll,rr,d);
		sum+=(rr-ll+1)*d;
		int l=-1,r=log2(w*2)+1;
		while(l+1<r){
			int mid=(l+r)>>1;
			int tem=pw(2,mid);
			if(tem==-1||tem-1>w/sum){
				r=mid;
			}else{
				l=mid;
			}
		}
		int fl=l,tmp=pow(2,l),last=(tmp-1)*sum;
		if(last==w){
			cout<<l*n-1<<"\n";
			continue;
		}
		l=0,r=n+1;
		while(l+1<r){
			int mid=(l+r)>>1;
			if(query(1,1,mid)>=(w-last)/tmp){
				r=mid;
			}else{
				l=mid;
			}
		}
		cout<<fl*n+r-1<<"\n";
	}
	return 0;
}
2024/10/20 18:39
加载中...