大佬帮忙排排错 全部RE P3373
  • 板块学术版
  • 楼主ZhangZX1
  • 当前回复0
  • 已保存回复0
  • 发布时间2020/6/21 16:24
  • 上次更新2023/11/7 00:15:49
查看原帖
大佬帮忙排排错 全部RE P3373
283097
ZhangZX1楼主2020/6/21 16:24
#include <bits/stdc++.h>
using namespace std;

struct node
{
	int l;
	int r;
	long long sum;
	int time;
	long long plus;
};
node t[400005];
long long n, m, mod, a[400005];

void build(long long p, long long l, long long r)
{
	t[p].l= l, t[p].r = r, t[p].time = 1, t[p].plus = 0;
	if (l == r)
	{
		t[p].sum = a[l] % mod; return;
	}
	long long mid = (l + r) >> 1;
	build(p * 2, l, mid);
	build(p * 2 + 1, mid + 1, r);
	t[p].sum = (t[p * 2].sum + t[p * 2 + 1].sum) % mod;
}

void push_down(long long p)
{
	if (t[p].time != 1 || t[p].plus != 0)
	{
		t[p * 2].time *= t[p].time;
		t[p * 2].time %= mod;
		t[p * 2].plus *= t[p].time;
		t[p * 2].plus += t[p].plus;
		t[p * 2].plus %= mod; 
		t[p * 2].sum = t[p * 2].sum * t[p].time + (t[p * 2].r - t[p * 2].l + 1) * t[p].plus;
		t[p * 2].sum %= mod;
		t[p * 2 + 1].time *= t[p].time;
		t[p * 2 + 1].time %= mod;
		t[p * 2 + 1].plus *= t[p].time;
		t[p * 2 + 1].plus += t[p].plus;
		t[p * 2 + 1].plus %= mod;
		t[p * 2 + 1].sum = t[p * 2 + 1].sum * t[p].time + (t[p * 2 + 1].r - t[p * 2 + 1].l + 1) * t[p].plus;
		t[p * 2 + 1].sum %= mod;
		t[p].time = 1;
		t[p].plus = 0;
	}
}

void ctime(long long p, long long l, long long r, long long d)
{
	if (l <= t[p].l && r >= t[p].r)
	{
		t[p].sum = t[p].sum * d % mod;
		t[p].time *= d;
		t[p].time %= mod;
		t[p].plus *= d;
		t[p].plus %= mod;
		return;
	}
	push_down(p);
	long long mid = (t[p].l + t[p].r) >> 1;
	if (l <= mid) ctime(p * 2, l, r, d);
	if (r > mid) ctime(p * 2 + 1, l, r, d);
	t[p].sum = (t[p * 2].sum + t[p * 2 + 1].sum) % mod;
}

void add(long long p, long long l, long long r, long long d)
{
	if (l <= t[p].l && r >= t[p].r)
	{
		t[p].sum += (t[p].r - t[p].l + 1) * d % mod;
		t[p].plus += d % mod;
		return;
	}
	push_down(p);
	long long mid = (t[p].l + t[p].r) >> 1;
	if (l <= mid) add(p * 2, l, r, d);
	if (r > mid) add(p * 2 + 1, l, r, d);
	t[p].sum = (t[p * 2].sum + t[p * 2 + 1].sum) % mod; 
}

long long ask(long long p, long long l, long long r)
{
	if (l <= t[p].l && r >= t[p].r) return t[p].sum;
	push_down(p);
	long long mid = (t[p].l + t[p]. r) >> 1, val = 0;
	if (l <= mid) val += ask(p * 2, l , r) % mod;
	if (r > mid) val += ask(p * 2 + 1, l , r) % mod;
	return val % mod;
}

int main()
{
	scanf("%d%d%d", &n, &m, &mod);
	for (long long i = 1; i <= n; i++)
		scanf("%d", &a[i]);
	build(1, 1, n);
	for (long long i = 1; i <= m; i++)
	{
		long long c, x, y, k;
		scanf("%d%d%d", &c, &x, &y);
		if (c == 1) 
		{
			scanf("%d", &k);
			ctime(1, x, y, k);
		}
		else if (c == 2)
		{
			scanf("%d", &k);
			add(1, x, y, k);
		}
		else
		{
			printf("%d\n", ask(1, x, y) % mod);
		}
	}
	return 0;
}
2020/6/21 16:24
加载中...