80Pts #11~14 WA 求调
查看原帖
80Pts #11~14 WA 求调
560036
Siven楼主2024/10/22 18:10
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,q;
long long sum,W;
long long a[200005<<2];
void build(int u,int L,int R)
{
	if(L==R)
	{
		scanf("%lld",&a[u]);
		sum+=a[u];
		return;
	}
	int mid=L+R>>1;
	int ls=u<<1,rs=u<<1|1;
	build(ls,L,mid),build(rs,mid+1,R);
	a[u]=a[ls]+a[rs];
}
int l,r,d;
long long lazy[200005<<2];
void pushdown(int u,int L,int R)
{
	int mid=L+R>>1;
	int ls=u<<1,rs=u<<1|1;
	lazy[ls]+=lazy[u];
	lazy[rs]+=lazy[u];
	a[ls]+=lazy[u]*(mid-L+1),a[rs]+=lazy[u]*(R-mid);
	lazy[u]=0;
}
void update(int u,int L,int R)
{
	if(L>r||R<l) return;
	if(lazy[u]&&L!=R)pushdown(u,L,R);//???
	if(l<=L&&R<=r)
	{
		lazy[u]+=d;
		a[u]+=1LL*(R-L+1)*d;
		return;
	}
	if(L==R) return; 
	int mid=L+R>>1;
	int ls=u<<1,rs=u<<1|1;
	update(ls,L,mid),update(rs,mid+1,R);
	a[u]=a[ls]+a[rs];
}

int query(int u,int L,int R,long long k)
{
	if(L==R)return L;
	if(lazy[u])pushdown(u,L,R);
	int mid=L+R>>1;
	int ls=u<<1,rs=u<<1|1;
	if(a[ls]>=k) return query(ls,L,mid,k);
	return query(rs,mid+1,R,k-a[ls]);
}
signed main()
{
//	freopen("wxyt3.in","r",stdin);
//	freopen("wxyt.out","w",stdout);
	scanf("%lld%lld%lld",&n,&q,&W);
	build(1,1,n);
	while(q--)
	{
		scanf("%lld%lld%lld",&l,&r,&d);
		update(1,1,n);
		sum+=1LL*(r-l+1)*d;
		long long kk=log2(W/sum+1);
		long long lft=W-sum*((1<<kk)-1);
		if(!lft) 
		{
			printf("%lld\n",kk*n-1);
			continue;
		}
		if(kk)
			lft/=(1<<kk);
		long long ans=query(1,1,n,lft)-1+kk*n;
		printf("%lld\n",ans);
	}
	return 0;
 } 
2024/10/22 18:10
加载中...