样例能过,全wa求dailao条
查看原帖
样例能过,全wa求dailao条
1391783
lpy927216楼主2024/7/17 17:47

本地样例,自己编的样例都能过,结果全wa

球球dailao看看问题出在哪里

#include <bits/stdc++.h>
using namespace std;
#define size1 100005
#define ll long long 
#define inf 0
struct node {
	ll l, r;
    ll s, d;
    ll dt = 1;
} t[size1 * 4];
int n, q, m;
ll a[size1];
void build(int p, int l, int r) {
	t[p].l = l, t[p].r = r;
	if (l == r) {
        t[p].s = a[l];
        return ;
    }
	int mid = (l + r) / 2;
    build(p * 2, l, mid);
    build(p * 2 + 1, mid + 1, r);
    t[p].s = t[2 * p].s + t[2 * p + 1].s;
}
void spread(int p) {
	if (!t[p].d || !t[p].dt) return;
	for (int i = 0; i <= 1; i++) {
		t[2 * p + i].s += (t[2 * p + i].r - t[2 * p + i].l + 1) * t[p].d;
		if (t[p].dt != 1)
			t[2 * p + i].s =  t[2 * p + i].s * (t[p].dt) % m;
		if (t[2 * p + i].l != t[2 * p + i].r) {
			t[2 * p + i].d += t[p].d;
			t[2 * p + i].dt = t[2 * p + i].dt * t[p].dt % m;
		}
	}
	t[p].d = 0;
	t[p].dt = 1;
}
void changea(int p, int l, int r, int x) {
	if (l <= t[p].l && r >= t[p].r) {
		t[p].s += (t[p].r - t[p].l + 1) * x % m;
		if (t[p].l != t[p].r) t[p].d = t[p].d + x;
		return;
    }
    else if (l > t[p].r || r < t[p].l) return;
    spread(p);
    changea(2 * p, l, r, x);
    changea(2 * p + 1, l, r, x);
    t[p].s = t[2 * p].s + t[2 * p + 1].s;
}
void changet(int p, int l, int r, int x) {
	if (l <= t[p].l && r >= t[p].r) {
		if (x != 1)
			t[p].s =  t[p].s * (x) % m;
		if (t[p].l != t[p].r) t[p].dt *= x;
		return;
    }
    else if (l > t[p].r || r < t[p].l) return;
    changet(2 * p, l, r, x);
    changet(2 * p + 1, l, r, x);
    t[p].s = (t[2 * p].s + t[2 * p + 1].s) % m;
}
ll ask(int p, int l, int r) {
	if (l <= t[p].l && r >= t[p].r) return t[p].s;
	else if (l > t[p].r || r < t[p].l) return 0;
	spread(p);
	return (ask(2 * p, l, r) + ask(2 * p + 1, l, r)) % m;
}

int main() {
	freopen("segmenttree.in" , "r",  stdin);
	freopen("segmenttree.out", "w", stdout);
	scanf("%d%d%d", &n, &q, &m);
	for (int i = 1; i <= n; i++)
		scanf("%d", &a[i]);
	build(1, 1, n);
	for (int i = 1; i <= q; i++) {
		int opt, x, y, z;
		scanf("%d%d%d", &opt, &x, &y);
		if (opt == 1) {
			scanf("%d", &z);
			changet(1, x, y, z);
		}
		else if (opt == 2) {
			scanf("%d", &z);
			changea(1, x, y, z);
		}
		else printf("%d\n", ask(1, x, y));
	}
}
2024/7/17 17:47
加载中...