丑陋的线段树二分0pts求调
查看原帖
丑陋的线段树二分0pts求调
1048484
DMqwq_phoenix_awaTWT楼主2024/10/20 20:58
#include<bits/stdc++.h>
#define ri register int
#define ll unsigned long long
#pragma G++ optimize(3)
using namespace std;
ll l[800010],r[800010],sum[800010],lz[800010],n,q,w,summ;
void u(int k)
{
	sum[k]=sum[k<<1]+sum[k<<1|1];
}
void d(int k)
{
	if(l[k]==r[k])return;
	sum[k<<1]+=(r[k<<1]-l[k<<1]+1)*lz[k];
	sum[k<<1|1]+=(r[k<<1|1]-l[k<<1|1]+1)*lz[k];
	lz[k<<1]+=lz[k];
	lz[k<<1|1]+=lz[k];
	lz[k]=0;
}
void build(int k,int L,int R)
{
	l[k]=L,r[k]=R,lz[k]=0;
	if(L==R)
	{
		scanf("%lld",&sum[k]);
		summ+=sum[k];
		return;
	}
	int mid=(L+R)>>1;
	build(k<<1,L,mid);
	build(k<<1|1,mid+1,R);
	u(k);
}
void update(int k,int L,int R,ll v)
{
	//cout<<l[k]<<" "<<r[k]<<endl;
	if(L<=l[k]&&r[k]<=R)
	{
		lz[k]+=v;
		sum[k]+=(r[k]-l[k]+1)*v;
		return;
	}
	ll mid=(l[k]+r[k])>>1;
	d(k);
	if(L<=mid)update(k<<1,L,R,v);
	if(R>mid)update(k<<1|1,L,R,v);
	u(k);
}
ll query(int k,int L,int R)
{
	if(L<=l[k]&&r[k]<=R)return sum[k];
	ll mid=(l[k]+r[k])>>1,res=0;
	d(k);
	if(L<=mid)res+=query(k<<1,L,R);
	if(R>mid)res+=query(k<<1|1,L,R);
	//cout<<res<<endl;
	return res;
}
ll erfen(int L,int R,int k,int lg)
{
	//cout<<k<<endl;
	int cnt=0;
	while(L<=R)
	{
		int mid=(L+R)>>1;
		ll res;
		res=query(1,1,mid)*lg;
		if(res>=k)R=mid-1;
		else L=mid+1,cnt=mid;
		//cout<<L<<" "<<R<<endl;
	}
	return cnt;
}
int main()
{
	scanf("%llu%llu%llu",&n,&q,&w);
	build(1,1,n);
	while(q--)
	{
		ll L,R,d,W=w,lg=1LL,ans=0,ss;
		scanf("%llu%llu%llu",&L,&R,&d);
		update(1,L,R,d);
		summ=query(1,1,n);
		
		//cout<<summ*lg<<endl;
		while(W>summ*lg)
		{
			W-=summ*lg;
			ans+=n;
			lg*=2LL;
		}
		printf("%llu\n",ans+erfen(1,n,W,lg));
	}
	return 0;
}

2024/10/20 20:58
加载中...