求调,WA
查看原帖
求调,WA
167697
BartAllen楼主2024/8/24 14:12
#include <bits/stdc++.h>
using namespace std;

#define ls(p) p << 1
#define rs(p) p << 1 | 1

const int N = 5e5 + 5;

int n, m;
int a[N], b[N];

struct Sgt {
	int l, r;
	int dat, sum;
	#define l(p) t[p].l
	#define r(p) t[p].r
	#define dat(p) t[p].dat
	#define sum(p) t[p].sum
} t[N << 2];

int gcd(int a, int b){
	return (b == 0) ? a : gcd(b, a % b);
}

void update(int p) {
	sum(p) = sum(ls(p)) + sum(rs(p));
	dat(p) = gcd(abs(dat(ls(p))), abs(dat(rs(p))));
}

void build(int p, int l, int r) {
	l(p) = l, r(p) = r;
	if (l == r) {
		dat(p) = sum(p) = b[l];
		return;
	}
	int mid = l + r >> 1;
	build(ls(p), l, mid);
	build(rs(p), mid + 1, r);
	update(p);
}

void change(int p, int x, int k) {
	if (l(p) == r(p)) {
		sum(p) += k, dat(p) += k;
		return;
	}
	int mid = l(p) + r(p) >> 1;
	if (x <= mid) change(ls(p), x, k);
	else change(rs(p), x, k);
	update(p);
}

int askgcd(int p, int l, int r) {
	if (l <= l(p) && r >= r(p)) return dat(p);
	int mid = l(p) + r(p) >> 1;
	int val = 0;
	if (l <= mid) val = gcd(abs(val), abs(askgcd(ls(p), l, r)));
	if (r > mid) val = gcd(abs(val), abs(askgcd(rs(p), l, r)));
	return val;
}

int asksum(int p, int l, int r) {
	if (l <= l(p) && r >= r(p)) return sum(p);
	int mid = l(p) + r(p) >> 1;
	int val = 0;
	if (l <= mid) val += asksum(ls(p), l, r);
	if (r > mid) val += asksum(rs(p), l, r);
	return val;
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
	cin >> n >> m;
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
		b[i] = a[i] - a[i - 1];
	}
	build(1, 1, n);
	for (int i = 1; i <= m; i++) {
		char opt;
		int l, r, d;
		cin >> opt;
		if (opt == 'C') {
			cin >> l >> r >> d;
			change(1, l, d);
			if (r != n) change(1, r + 1, -d);
		}
		if (opt == 'Q') {
			cin >> l >> r;
			cout << abs(gcd(asksum(1, 1, l), askgcd(1, l + 1, r))) << "\n";
		}
	}
	return 0;
}
2024/8/24 14:12
加载中...