树状数组 40 pts 求助
查看原帖
树状数组 40 pts 求助
814343
bc2_cryeggy楼主2024/1/25 14:14

真检查不出错误。

#include <iostream>
#include <algorithm>
#include <cmath>
#include <stack>

using namespace std;

using ll = long long;

const int kMaxN = 2e5 + 20, kInf = (((1 << 30) - 1) << 1) + 1;
const ll kLInf = 9.22e18;

int n, m, a[kMaxN], tree[kMaxN];
int lowbit(int x) {return (x & (-x));}

void Update(int x, int val) {
  for (; x <= n; x += lowbit(x)) {
    tree[x] = val;
    for (int i = 1; i < lowbit(x); i <<= 1) {
      tree[x] = max(tree[x], tree[x - i]);
    }
  }
}

int Query(int l, int r) {
  int ans = 0;
  for (; l <= r; ) {
    ans = max(ans, a[r]);
    -- r;
    for (; r - l >= lowbit(r); ) {
      ans = max(ans, tree[r]);
      r -= lowbit(r);
    }
  }
  return ans;
}

int main() {
  ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  cin >> n >> m;
  for (int i = 1; i <= n; ++ i) {
    cin >> a[i];
    Update(i, a[i]);
  }
  char op;
  int A, b;
  for (; m; -- m) {
    cin >> op;
    if (op == 'Q') {
      cin >> A >> b;
      cout << Query(A, b) << '\n';
    } else {
      cin >> A >> b;
      a[A] = b;
      Update(A, b);
    }
  }
  return 0;
}
2024/1/25 14:14
加载中...