线段树0pts全TLE求调
查看原帖
线段树0pts全TLE求调
931633
742643qh楼主2024/10/22 17:47
#include<bits/stdc++.h>
#define ll long long 
const int N=1e6+10;
using namespace std;
ll a[N];
struct tree{
	ll l,r;
	ll ad,dat;
}t[N];
inline void build(int q,ll l,ll r){
	t[q].l=l,t[q].r=r;
	if(l==r){
		t[q].dat=a[l];
		return;
	}
	ll mid=(t[q].l+t[q].r)>>1;
	build(q<<1,l,mid);
	build(q<<1|1,mid+1,r);
	t[q].dat=t[q<<1].dat+t[q<<1|1].dat;
	return;
}
inline void spread(int q){
	if(t[q].ad){
		t[q<<1].dat+=t[q].ad*(t[q<<1].r-t[q<<1].l+1);
		t[q<<1|1].dat+=t[q].ad*(t[q<<1|1].r-t[q<<1|1].l+1);
		t[q<<1].ad=t[q].ad;
		t[q<<1|1].ad=t[q].ad;
		t[q].ad=0;
	}
}
inline void change(int q,ll l,ll r,ll d){
	if(t[q].l>=l&&t[q].r<=r){
		t[q].dat+=d*(t[q].r-t[q].l+1);
		t[q].ad+=d;
		return;
	}
	spread(q);
	ll mid=(t[q].l+t[q].r)>>1;
	if(l<=mid) change(q<<1,l,r,d);
	if(r>mid) change(q<<1|1,l,r,d);
	t[q].dat=t[q<<1].dat+t[q<<1|1].dat;
	return;
}
inline ll solve(ll p,ll v,ll f){
	ll l=t[p].l,r=t[p].r;
	if(l==r) return l;
	spread(p);
	if(t[p<<1].dat*f<v) 
	return solve(p<<1|1,v-t[p<<1].dat*f,f);
	return solve(p<<1,v,f);
}
int main(){
	ios::sync_with_stdio(false);
	int n,q,w;
	cin>>n>>q>>w;
	for(int i=1;i<=n;i++) cin>>a[i];
	build(1,1,n);
    while(q--){
    	ll l,r,d;
    	cin>>l>>r>>d;
    	change(1,l,r,d);
    	ll ans=0,f=1,v=w;
    	while(v>t[1].dat*f) {
    		v-=t[1].dat*f;
    		f<<=1;
    		ans+=n;
		}
		printf("%lld\n",ans+solve(1,v,f)-1);
	}
	return 0;
} 
2024/10/22 17:47
加载中...