求调,玄关
  • 板块题目总版
  • 楼主cqbzzlr
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/7/12 15:14
  • 上次更新2024/7/12 16:00:14
查看原帖
求调,玄关
1238483
cqbzzlr楼主2024/7/12 15:14

样例全过但0分

#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

typedef long long ll;
const ll N = 1e6 + 5;
const ll INF = 0x3f3f3f3f;
const ll eps = 1e-6;

typedef long long ll;

ll n, m, p;
ll tree[N], tag[N], mul[N], a[N];

ll ls(ll x) {
	return x << 1;
}
ll rs(ll x) {
	return x << 1 | 1;
}

void push_down(ll x, ll l, ll r) {
	if (mul[x] != 1) {
		mul[ls(x)] = (mul[ls(x)] * mul[x]) % p;
		mul[rs(x)] = (mul[rs(x)] * mul[x]) % p;
		tag[ls(x)] = (mul[ls(x)] * mul[x]) % p;
		tag[rs(x)] = (mul[rs(x)] * mul[x]) % p;
		tree[ls(x)] = (mul[ls(x)] * mul[x]) % p;
		tree[rs(x)] = (mul[rs(x)] * mul[x]) % p;
	}
	mul[x] = 1;
	if (tag[x]) {
		ll mid = (l + r) >> 1;
		tree[ls(x)] = (tree[ls(x)] % p + tag[x] % p * (mid - l + 1) % p) % p;
		tree[rs(x)] = (tree[rs(x)] % p + tag[x] % p * (r - mid) % p) % p;
		tag[ls(x)] = (tag[ls(x)] % p + tag[x] % p) % p;
		tag[rs(x)] = (tag[rs(x)] % p + tag[x] % p) % p;
	}
	tag[x] = 0;
}

void build(ll x, ll l, ll r) {
	mul[x] = 1;
	if (l == r) {
		tree[x] = a[l];
		return ;
	}
	ll mid = (l + r) >> 1;
	build(ls(x), l, mid);
	build(rs(x), mid + 1, r);
	tree[x] = tree[ls(x)] + tree[rs(x)];
}

void add_update(ll x, ll l, ll r, ll L, ll R, ll k) {
	if (L <= l && r <= R) {
		tree[x] += k * (r - l + 1) % p;
		tag[x] += k;
		return;
	}
	push_down(x,l,r);
	ll mid = (l + r) / 2;
	if(mid >= L) add_update(ls(x), l, mid, L, R, k);
	if(mid + 1 <= R) add_update(rs(x), mid + 1, r, L, R, k);
	tree[x] = tree[ls(x)] + tree[rs(x)];
	return;
}

void mul_update(ll x, ll l, ll r, ll L, ll R, ll k) {
	if (l >= L && r <= R) {
		mul[x] = (mul[x] * k) % p;
		tag[x] = (tag[x] * k) % p;
		tree[x] = (tree[x] * k) % p;
		return;
	}
	push_down(x,l,r);
	ll mid = (l + r) / 2;
	if(mid >= L) mul_update(ls(x), l, mid, L, R, k);
	if(mid + 1 <= R) mul_update(rs(x), mid + 1, r, L, R, k);
	tree[x] = tree[ls(x)] + tree[rs(x)];
	return;
}

ll query(ll x, ll l, ll r, ll L, ll R) {
	if (L <= l && r <= R) return tree[x];	 	
	ll mid = (l + r) / 2;
	ll summ = 0;
	push_down(x,l,r);
	if(mid >= L) summ += query(ls(x), l, mid, L, R);
	if(mid + 1 <= R) summ += query(rs(x), mid + 1, r, L, R);
	return summ;
}


inline void solve() {
	
	cin >> n >> m >> p;
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
	}
	build(1, 1, n);
	while (m--) {
		ll z, x, y, k;
		cin >> z;
		if (z == 1) {
			cin >> x >> y >> k;
			mul_update(1, 1, n, x, y, k);
	//		for(int i = 1;i <= n;i++) cout << tree[i] << " " << tag[i] << endl;
		}
		if (z == 2) {
			cin >> x >> y >> k;
			add_update(1, 1, n, x, y, k);
	//		for(int i = 1;i <= n;i++) cout << tree[i] << " " << tag[i] << endl;			
		}
		if (z == 3) {
			cin >> x >> y;
			cout << query(1, 1, n, x, y) % p << endl;
		}
	}
	return ;
}

signed main() {
	ll T = 1;
	//cin>>T;
	solve();
}
2024/7/12 15:14
加载中...