求助CF438D
  • 板块学术版
  • 楼主happybob
  • 当前回复2
  • 已保存回复2
  • 发布时间2022/1/23 14:48
  • 上次更新2023/10/28 11:27:14
查看原帖
求助CF438D
332914
happybob楼主2022/1/23 14:48

https://www.luogu.com.cn/problem/CF438D

线段树第 3939 个点 wawa

#include <bits/stdc++.h>
using namespace std;

#define ll long long
const int N = 3e5 + 5;
ll n, m, w[N], mod;

struct Node
{
	ll l, r, sum, maxn;
};

Node tree[N << 2];

inline void push_up(ll u)
{
	tree[u].sum = tree[u << 1].sum + tree[u << 1 | 1].sum;
	tree[u].maxn = max(tree[u << 1].maxn, tree[u << 1 | 1].maxn);
}

inline void build(ll u, ll l, ll r)
{
	tree[u].l = l;
	tree[u].r = r;
	if (l == r) tree[u].sum = tree[u].maxn = w[r];
	else
	{
		int mid = (l + r) >> 1;
		build(u << 1, l, mid);
		build(u << 1 | 1, mid + 1, r);
		push_up(u);
	}
}

inline void modify1(ll u, ll x, ll v)
{
	if (tree[u].l == x && tree[u].r == x) tree[u].sum = v, tree[u].maxn = v;
	else
	{
		int mid = (tree[u].l + tree[u].r) >> 1;
		if (x <= mid) modify1(u << 1, x, v);
		else modify1(u << 1 | 1, x, v);
		push_up(u);
	}
}

inline void modify2(ll u, ll l, ll r)
{
	if (tree[u].l >= l && tree[u].r <= r && tree[u].sum < mod) return;
	if (tree[u].l >= l && tree[u].r <= r && tree[u].l == tree[u].r)
	{
		tree[u].sum %= mod;
		tree[u].maxn %= mod;
		return;
	}
	int mid = (tree[u].l + tree[u].r) >> 1;
	if (l <= mid) modify2(u << 1, l, r);
	if (r > mid) modify2(u << 1 | 1, l, r);
	push_up(u);
}

inline int query(ll u, ll l, ll r)
{
	if (tree[u].l >= l && tree[u].r <= r) return tree[u].sum;
	int mid = (tree[u].l + tree[u].r) >> 1, ans = 0;
	if (l <= mid) ans += query(u << 1, l, r);
	if (r > mid) ans += query(u << 1 | 1, l, r);
	return ans;
}

int main()
{
	scanf("%lld %lld", &n, &m);
	for (register int i = 1; i <= n; i++) scanf("%lld", &w[i]);
	build(1, 1, n);
	while (m--)
	{
		int x;
		scanf("%lld", &x);
		if (x == 1)
		{
			int l, r;
			scanf("%lld %lld", &l, &r);
			printf("%lld\n", query(1, l, r));
		}
		else if (x == 2)
		{
			int x, y;
			scanf("%lld %lld %lld", &x, &y, &mod);
			modify2(1, x, y);
		}
		else
		{
			int x, y;
			scanf("%lld %lld", &x, &y);
			modify1(1, x, y);
		}
	}
	return 0;
}
2022/1/23 14:48
加载中...