线段树二分60分求条
查看原帖
线段树二分60分求条
416975
sbno333楼主2024/10/23 18:30
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,q,w;
int a[200009];
struct st{
	int l,r;
	int ans,laz;
}f[1000009];
inline void pushdown(int t){
	if(f[t].l!=f[t].r){
		f[2*t].laz+=f[t].laz;
		f[2*t].ans+=f[t].laz*(f[2*t].r-f[2*t].l+1);
		f[2*t+1].laz+=f[t].laz;
		f[2*t+1].ans+=f[t].laz*(f[2*t+1].r-f[2*t+1].l+1);
	}
	f[t].laz=0;
}
inline void pushup(int t){
	pushdown(t);
	f[t].ans=f[2*t].ans+f[2*t+1].ans;
}
inline void build(int t,int l,int r){
	f[t].l=l;
	f[t].r=r;
	f[t].laz=0;
	if(l==r){
		f[t].ans=a[l];
		return;
	}
	int mid;
	mid=l+r;
	mid>>=1;
	build(2*t,l,mid);
	build(2*t+1,mid+1,r);
	pushup(t);
}
inline void add(int t,int l,int r,int d){
	pushdown(t);
	if(f[t].l==l&&f[t].r==r){
		f[t].ans+=(r-l+1)*d;
		f[t].laz+=d;
		return;
	}
	int mid;
	mid=f[t].l+f[t].r;
	mid>>=1;
	if(r<=mid){
		add(2*t,l,r,d);
	}else if(l>mid){
		add(2*t+1,l,r,d);
	}else{
		add(2*t,l,mid,d);
		add(2*t+1,mid+1,r,d);
	}
	pushup(t);
}
inline int query(int t,int l,int r){
	pushdown(t);
	if(f[t].l==l&&f[t].r==r){
		return f[t].ans;
	}
	int mid;
	mid=f[t].l+f[t].r;
	mid>>=1;
	if(r<=mid){
		return query(2*t,l,r);
	}else if(l>mid){
		return query(2*t+1,l,r);
	}else{
		return query(2*t,l,mid)+query(2*t+1,mid+1,r);
	}
}
inline int ef(int t,int l,int r,int &w,int z){
	if(w<=0){
		return 0;
	}
	pushdown(t);
	if(f[t].l==f[t].r){
		w-=f[t].ans*z;
		return 1;
	}
	if(f[t].l==l&&f[t].r==r){
		if(w>f[t].ans*z){
			w-=f[t].ans*z;
			return r-l+1;
		}
		int mid;
		mid=l+r;
		mid>>=1;
		if(w>f[2*t].ans*z){
			w-=f[2*t].ans*z;
			return mid-l+1+ef(2*t+1,mid+1,r,w,z);
		}else{
			return ef(2*t,l,mid,w,z);
		}
	}
	int mid;
	mid=f[t].l+f[t].r;
	mid>>=1;
	if(r<=mid){
		return ef(2*t,l,r,w,z);
	}else if(l>mid){
		return ef(2*t+1,l,r,w,z);
	}else{
		return ef(2*t,l,mid,w,z)+ef(2*t+1,mid+1,r,w,z);
	}
}
inline int quetion(int l,int r){
	int ww;
	ww=w;
	int zz;
	zz=query(1,l,r);
	int c;
	c=1;
	int ans;
	ans=0;
	while(c*zz<ww){
		ww-=c*zz;
		c*=2;
		ans+=r-l+1;
	}
	ans+=ef(1,l,r,ww,c);
	ans--;
	return ans;
}
signed main(){
	cin.tie();
	cout.tie();
	std::ios::sync_with_stdio(0);
	cin>>n>>q>>w;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	build(1,1,n);
	while(q--){
		int l,r,d;
		cin>>l>>r>>d;
		add(1,l,r,d);
		cout<<quetion(1,n)<<"\n";
	}
	return 0;
}
2024/10/23 18:30
加载中...