线段树+二分 60pts 求调
查看原帖
线段树+二分 60pts 求调
610349
tracy_yuxi楼主2024/10/23 10:15
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
#define int long long
#define lc p<<1
#define rc p<<1|1
struct node{int l,r,sum,add;}tr[N*4];
int a[N];
void build(int p,int l,int r){
	tr[p].l=l,tr[p].r=r;
	if(l==r){tr[p].sum=a[l];return;}
	int mid=l+r>>1;
	build(lc,l,mid);build(rc,mid+1,r);
	tr[p].sum=tr[lc].sum+tr[rc].sum;
}
void pushdown(int p){
	if(tr[p].add){
		tr[lc].sum+=tr[p].add*(tr[lc].r-tr[lc].l+1);
		tr[rc].sum+=tr[p].add*(tr[rc].r-tr[rc].l+1);
		tr[lc].add+=tr[p].add;tr[rc].add+=tr[p].add;
		tr[p].add=0;
	}
}
void update(int p,int x,int y,int k){
	if(tr[p].l>=x&&tr[p].r<=y){tr[p].sum+=k*(tr[p].r-tr[p].l+1);tr[p].add+=k;return;}
	pushdown(p);
	int mid=tr[p].l+tr[p].r>>1;
	if(x<=mid)update(lc,x,y,k);
	if(y>mid)update(rc,x,y,k);
	tr[p].sum=tr[lc].sum+tr[rc].sum;
}
int query(int p,int x,int y){
	if(tr[p].l>=x&&tr[p].r<=y)return tr[p].sum;
	int mid=tr[p].l+tr[p].r>>1;
	int sum=0;
	pushdown(p);
	if(x<=mid)sum+=query(lc,x,y);
	if(y>mid)sum+=query(rc,x,y);
	return sum;
}
int query2(int p,int l,int r,int level,int blood){
	if(l==r)return l;
	int mid=l+r>>1;
	pushdown(p);
	if(blood>tr[lc].sum*level)return query2(rc,mid+1,r,level,blood-tr[lc].sum*level);
	else return query2(lc,l,mid,level,blood);
}
signed main(){
	int n,q,w;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;
		update(1,l,r,d);
		int sum=query(1,1,n);
		int lev=1,blood=w,cnt=0;
		while(1){
			if(blood<=sum*lev)break;
			blood-=sum*lev;
			lev*=2;cnt+=n;
		}
		int res=query2(1,1,n,lev,blood);
		cout<<cnt+res-1<<endl;
	}
	return 0;
}
2024/10/23 10:15
加载中...