RE求助,一直没找到错误的点(编译器提示47,48行出问题)
查看原帖
RE求助,一直没找到错误的点(编译器提示47,48行出问题)
727008
lwx20211103楼主2023/7/26 22:56
// Problem: P3373 【模板】线段树 2
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P3373
// Memory Limit: 125 MB
// Time Limit: 1000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

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

typedef long long ll;
const int maxn = 114514;

struct tree
{
	int l, r;
	ll sum, add, mul;
	#define sum(x) t[x].sum
	#define add(x) t[x].add
	#define mul(x) t[x].mul
	#define l(x) t[x].l
	#define r(x) t[x].r
	#define ls(x) x << 1
	#define rs(x) x << 1 | 1
} t[maxn << 2];

ll mod, n, m, nums[maxn];

void build(int p, int l, int r)
{
	l(p) = l, r(p) = r;
	mul(p) = 1;
	if (l == r)
	{
		sum(p) = nums[l] % mod;
		return ;
	}
	int mid = (l + r) >> 1;
	build(ls(p), l, mid);
	build(rs(p), mid + 1, r);
	sum(p) = (sum(ls(p)) + sum(rs(p))) % mod;
}

void mark(int p)
{
	sum(ls(p)) = (ll)(sum(ls(p)) * mul(p) + 
	(add(p) * (r(ls(p)) - l(ls(p)) + 1)) % mod) % mod;
	sum(rs(p)) = (ll)(sum(rs(p)) * mul(p) + 
	(add(p) * (r(rs(p)) - l(rs(p)) + 1)) % mod) % mod;
	
	mul(ls(p)) = (ll)(mul(ls(p)) * mul(p)) % mod;
	mul(rs(p)) = (ll)(mul(rs(p)) * mul(p)) % mod;
	
	add(ls(p)) = (ll)(add(ls(p)) * mul(p) + add(p)) % mod;
	add(rs(p)) = (ll)(add(rs(p)) * mul(p) + add(p)) % mod;
	add(p) = 0, mul(p) = 1;
	return ;
}

void pls(int p, int l, int r, ll k)
{
	if (l(p) >= l && r(p) <= r)
	{
		add(p) = (add(p) + k) % mod;
		sum(p) = (sum(p) + k * (r(p) - l(p) + 1)) % mod;
		return ;
	}
	mark(p);
	int mid = (l(p) + r(p)) >> 1;
	sum(p) = (sum(ls(p)) + sum(rs(p))) % mod;
	if (l <= mid) pls(ls(p), l, r, k);
	if (r > mid) pls(rs(p), l, r, k);
	sum(p) = (sum(ls(p)) + sum(rs(p))) % mod;
}

void mu(int p, int l, int r, ll k)
{
	if (l(p) >= l && r(p) <= r)
	{
		mul(p) = (mul(p) * k) % mod;
		add(p) = (add(p) * k) % mod;
		sum(p) = (sum(p) * k) % mod;
		return ;
	}
	mark(p);
	int mid = (l + r) >> 1;
	sum(p) = (sum(ls(p)) + sum(rs(p))) % mod;
	if (l <= mid) mu(ls(p), l, r, k);
	if (r > mid) mu(rs(p), l, r, k);
	sum(p) = (sum(ls(p)) + sum(rs(p))) % mod;
} 

ll ask(int p, int l, int r)
{
	if (l(p) >= l && r(p) <= r)
	{
		return sum(p);
	}
	mark(p);
	int mid = (l + r) >> 1;
	ll ans = 0;
	if (l <= mid) ans = (ans + ask(ls(p), l, r)) % mod;
	if (r > mid) ans += (ans + ask(rs(p), l, r)) % mod;
	return ans;
	
}

signed main()
{
	ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);
	cin >> n >> m >> mod;
	for (int i = 1; i <= n; i++)
	{
		cin >> nums[i];
	}
	build(1, 1, n);
	while (m--)
	{
		int op, l, r;
		cin >> op >> l >> r;
		if (op == 1)
		{
			ll x;
			cin >> x;
			mu(1, l, r, x);
		}
		else if (op == 2)
		{
			ll x;
			cin >> x;
			pls(1, l, r, x);
		}
		else
		{
			cout << ask(1, l, r) << "\n";
		}
	}
	return 0;
}

2023/7/26 22:56
加载中...