求调/求 hack 数据
查看原帖
求调/求 hack 数据
726139
残阳如血楼主2024/7/21 08:14
#include <bits/stdc++.h>
using lint = long long;
// const int N = 5e5 + 10;
const int N = 6;
#define DEBUG

int n, m;
size_t l, r;
lint d, a[N], b[N];

struct SegmentTree {
  lint w[4 * N];

  bool outRange(int l, int r, int L, int R) {
    return l > R || r < L;
  }

  bool inRange(int l, int r, int L, int R) {
    return l >= L && r <= R;
  }

  void pushup(int u) {
    w[u] = std::__gcd(w[u * 2], w[u * 2 + 1]);
  }

  void build(int u, int l, int r, lint *a) {
    if (l == r) {
      w[u] = a[l];
      return ;
    }
    int mid = l + r >> 1;
    build(u * 2, l, mid, a);
    build(u * 2 + 1, mid + 1, r, a);
    pushup(u);
  }

  lint query(int u, int l, int r, int L, int R) {
    if (outRange(l, r, L, R)) return -1;
    if (inRange(l, r, L, R)) return w[u];
    int mid = l + r >> 1;
    lint lans = query(u * 2, l, mid, L, R);
    lint rans = query(u * 2 + 1, mid + 1, r, L, R);
    lint res;
    if (lans == -1) {
      if (rans == -1) res = -1;
      else res = rans;
    } else {
      if (rans == -1) res = lans;
      else res = std::__gcd(lans, rans);
    }
    return res;
  }

  void update(int u, int l, int r, int p, int delta) {
    if (outRange(l, r, p, p)) return ;
    if (inRange(l, r, p, p) && l == r) {
      w[u] += delta;
      return ;
    }
    int mid = l + r >> 1;
    update(u * 2 , l, mid, p, delta);
    update(u * 2 + 1, mid + 1, r, p, delta);
  }
};

struct BIT {
  lint w[N];

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

  void add(size_t p, lint delta) {
    for (size_t i = p; i <= n; i += lowbit(i))
      w[i] += delta;
  }

  lint query(size_t p) {
    lint res = 0;
    for (size_t i = p; i >= 1; i -= lowbit(i))
      res += w[i];
    return res;
  }
};

BIT t;
SegmentTree tree;

signed main() {
#ifndef DEBUG
  std::cin.tie(0)->sync_with_stdio(0);
#endif
  std::cin >> n >> m;
  assert(n <= (int)5e5);
  assert(m <= (int)1e5);
  for (int i = 1; i <= n; ++i) {
    std::cin >> a[i];
    assert(a[i] >= 1 && a[i] <= (lint)1e18);
    b[i] = a[i] - a[i - 1];
    t.add(i, b[i]);
  }

#ifdef DEBUG
  for (int i = 1; i <= n; ++i) printf("%3d", i);
  puts("");
  for (int i = 1; i <= n; ++i) printf("%3d", a[i]);
  puts("");
  for (int i = 1; i <= n; ++i) printf("%3d", b[i]);
  puts("");
  for (int i = 1; i <= n; ++i) printf("%3d", t.w[i]);
  puts("");
#endif



  tree.build(1, 1, n, b);
  for (std::string op; m; --m) {
    std::cin >> op >> l >> r;
    assert(l >= 1 && l <= n);
    assert(r >= 1 && r <= n && r >= l);
    if (op == "C") {
      std::cin >> d;
      tree.update(1, 1, n, l, d);
      t.add(l, d);
      if (r < n) {
        tree.update(1, 1, n, r + 1, -d);
        t.add(r + 1, d);
      }
    } else if (op == "Q") {
      if (l == r) std::cout << abs(t.query(l)) << '\n';
      else if (l + 1 == r) std::cout << abs(std::__gcd(t.query(l), t.query(r))) << '\n';
      else std::cout << abs(std::__gcd(t.query(l), tree.query(1, 1, n, l + 1, r))) << '\n';
    } else exit(1);
  }
  std::cout.flush();
  return 0;
}
2024/7/21 08:14
加载中...