#15~#20 TLE 求助
查看原帖
#15~#20 TLE 求助
678175
jqQt0220楼主2024/10/24 17:52
#include<bits/stdc++.h>
using namespace std;
// #define fileio
#define IOS
void ___()
{
#ifdef fileio
    freopen(".in","r",stdin);
    freopen(".out","w",stdout);
#endif
#ifdef IOS
    ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
    #define endl '\n'
#endif
}
#define ll long long
const int _mxn=2e5+5;
int n;
ll W,a[_mxn];
namespace segtree
{
	struct node
	{
		int l,r;
		ll sum,tag;
		int len(){return r-l+1;}
	}tr[_mxn<<2];
	int ls(int p){return p<<1;}
	int rs(int p){return p<<1|1;}
	void pushup(int p)
	{
		tr[p].sum=tr[ls(p)].sum+tr[rs(p)].sum;
	}
	void build(int p,int l,int r)
	{
		tr[p].l=l,tr[p].r=r;
		tr[p].tag=0;
		if(l==r)
		{
			tr[p].sum=a[l];
			return;
		}
		int mid=(l+r)>>1;
		build(ls(p),l,mid);
		build(rs(p),mid+1,r);
		pushup(p);
	}
	void pushdown(int p)
	{
		ll t=tr[p].tag;
		tr[p].tag=0;
		tr[ls(p)].sum+=t*tr[ls(p)].len();
		tr[rs(p)].sum+=t*tr[rs(p)].len();
		tr[ls(p)].tag+=t;
		tr[rs(p)].tag+=t;
	}
	void update(int p,int l,int r,ll k)
	{
		if(l<=tr[p].l&&tr[p].r<=r)
		{
			tr[p].sum+=k*tr[p].len();
			tr[p].tag+=k;
			return;
		}
		pushdown(p);
		int mid=(tr[p].l+tr[p].r)>>1;
		if(l<=mid)
			update(ls(p),l,r,k);
		if(mid<r)
			update(rs(p),l,r,k);
		pushup(p);
	}
	ll query(int p,int l,int r)
	{
		if(l<=tr[p].l&&tr[p].r<=r)
			return tr[p].sum;
		pushdown(p);
		int mid=(tr[p].l+tr[p].r)>>1;
		ll res=0;
		if(l<=mid)
			res+=query(ls(p),l,r);
		if(mid<r)
			res+=query(rs(p),l,r);
		return res;
	}
	int queryp(int p,int l,int r,int rd,ll w)
	{
		if(l==r)
			return l;
		pushdown(p);
		int mid=(l+r)>>1;
		ll h=tr[ls(p)].sum*(1ll<<rd);
		if(w>h)
			return queryp(rs(p),mid+1,r,rd,w-h);
		else
			return queryp(ls(p),l,mid,rd,w);
	}
}
int main()
{
    ___();
	int q;
	cin>>n>>q>>W;
	for(int i=1;i<=n;i++)
		cin>>a[i];
	segtree::build(1,1,n);
	while(q--)
	{
		int L,R;
		ll d;
		cin>>L>>R>>d;
		segtree::update(1,L,R,d);
		ll s=segtree::query(1,1,n);
		ll w=W;
		int rd=0;
		while(114514<1919810)
		{
			if(w<=s)
				break;
			w-=s;
			s*=2;
			rd++;
		}
		cout<<rd*n+segtree::queryp(1,1,n,rd,w)-1<<endl;
	}
    return 0;
}
2024/10/24 17:52
加载中...