求调A
  • 板块学术版
  • 楼主c______
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/10/20 18:39
  • 上次更新2024/10/20 20:05:03
查看原帖
求调A
765954
c______楼主2024/10/20 18:39
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ls p << 1
#define rs p << 1 | 1

const int N = 2e5 + 5;
const ll mod = 19940417;

struct node
{
	int l, r;
	ll sum, laz;
}tree[N << 2];

int n, q;
ll a[N];
ll W;

void pushdown(int p)
{
	if (tree[p].laz == 0) return;
	tree[ls].laz += tree[p].laz, tree[rs].laz += tree[p].laz;
	tree[ls].sum += (tree[ls].r - tree[ls].l + 1) * tree[p].laz;
	tree[rs].sum += (tree[rs].r - tree[rs].l + 1) * tree[p].laz;
	tree[p].laz = 0;
}

void build(int p, int l, int r)
{
	tree[p].l = l, tree[p].r = r;
	if (l == r)
	{
		tree[p].sum = a[l];
		return;
	}
	int mid = tree[p].l + tree[p].r >> 1;
	build(ls, l, mid);
	build(rs, mid + 1, r);
	tree[p].sum = tree[ls].sum + tree[rs].sum;
}

void modify(int p, int l, int r, ll k)
{
	if (l <= tree[p].l && tree[p].r <= r)
	{
		tree[p].laz += k, tree[p].sum += (tree[p].r - tree[p].l + 1ll) * k;
		return;
	}
	pushdown(p);
	int mid = tree[p].l + tree[p].r >> 1;
	if (l <= mid)
		modify(ls, l, r, k);
	if (r > mid)
		modify(rs, l, r, k);
	tree[p].sum = tree[ls].sum + tree[rs].sum;
}

ll query(int p, int l, int r)
{
	if (l <= tree[p].l && tree[p].r <= r)
		return tree[p].sum;
	pushdown(p);
	int mid = tree[p].l + tree[p].r >> 1;
	ll res = 0;
	if (l <= mid)
		res += query(ls, l, r);
	if (r > mid)
		res += query(rs, l, r);
	return res;
}

void solve()
{
	scanf("%d%d%lld",&n,&q,&W);
	for (int i = 1; i <= n; i ++)
		scanf("%lld", &a[i]);
	build(1, 1, n);
	for (int i = 1; i <= q; i ++)
	{
		int l, r, p = 1;
		ll d, sum = 0, ans = 0, w = W, cnt = 0, base = 2;
		cin >> l >> r >> d;
		modify(1, l, r, d);
		sum = query(1, 1, n);
		while (sum * (base - 1) < W)
			base *= 2, cnt ++;
		ans += cnt * n, w -= ((1ll << cnt) - 1) * sum;
        while (tree[p].r > tree[p].l)
        {
            pushdown(p);
            if (tree[ls].l > 0 && tree[ls].sum * (1ll << cnt) < w)
                w -= tree[ls].sum * (1ll << cnt), p = rs;
            else
                p = ls;
        }
		printf("%lld\n", ans + tree[p].l - 1);
	}
}

signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);
	//freopen("code.in", "r", stdin);
	//freopen("code.out", "w", stdout);
	solve();
	return 0;
}
2024/10/20 18:39
加载中...