Wrong Answer 求调
  • 板块P10463 To the Max
  • 楼主zhanglh
  • 当前回复8
  • 已保存回复8
  • 发布时间2024/11/8 20:46
  • 上次更新2024/11/8 22:49:49
查看原帖
Wrong Answer 求调
726862
zhanglh楼主2024/11/8 20:46
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
#include <queue>
#include <cmath>

using namespace std;

typedef long long ll;

const int N = 500010;

int n, q;
ll a[N], b[N], tr[N], g[N*4];

int ls(int u) { return u << 1; }
int rs(int u) { return u << 1 | 1; }

//Interval GCD

ll gcd(ll a, ll b) { return b ? gcd(b, a % b) : a; }

ll lowbit(ll i) { return i & -i; }

void add(int x, ll k) {
    for (int i = x; i <= n; i += lowbit(i)) tr[i] += k;
}

ll sum(int x) {
    ll res = 0;
    for (int i = x; i > 0; i -= lowbit(i)) res += tr[i];
    return res;
}

void pushUp(int u) { g[u] = gcd(g[ls(u)], g[rs(u)]); }

void build(int u, int l, int r) {
	if (l == r) {
		g[u] = b[r];
		return;
	}
	int mid = (l + r) >> 1;
	build(ls(u), l, mid);
	build(rs(u), mid + 1, r);
	pushUp(u);
}

void update(int u, int l, int r, int x, ll k) {
	if (l == x && r == x) { g[u] += k; return; }
	int mid = (l + r) >> 1;
	if (x <= mid) update(ls(u), l, mid, x, k);
	else update(rs(u), mid + 1, r, x, k);
	pushUp(u);
}

int query(int u, int l, int r, int ql, int qr) {
	if (l >= ql && r <= qr) return g[u];
	int mid = (l + r) >> 1, g = 0;
	if (ql <= mid) g = query(ls(u), l, mid, ql, qr);
	if (qr > mid) g = gcd(g, query(rs(u), mid + 1, r, ql, qr));
	return g;
}

int main() {
	scanf("%d%d", &n, &q);
	for (int i = 1; i <= n; i++) {
		scanf("%lld", &a[i]);
		b[i] = a[i] - a[i - 1];
	}
	build(1, 1, n);
	while(q--) {
		char o[2]; int l, r;
		scanf("%s%d%d", o, &l, &r);
		if (*o == 'C') {
			ll k;
			scanf("%lld", &k);
			update(1, 1, n, l, k);
			add(l, k);
			if (r < n) {
			    update(1, 1, n, r + 1, -k);
			    add(r + 1, -k);
			}
		} else {
		    ll v = a[l] + sum(l);
		    printf("%lld\n", abs(gcd(v, query(1, 1, n, l + 1, r))));
		}
	}
	return 0;
}
2024/11/8 20:46
加载中...