线段数求调!!
查看原帖
线段数求调!!
519573
Daniel_yao楼主2022/4/4 14:45
#include<bits/stdc++.h>
using namespace std;
const int N = 200005;
int n, m;
int a[N], tree[4 * N], ans = INT_MIN;

void build_tree(int node, int start, int end){
  if(start == end){
    tree[node] = a[start];
    return ;
  }
  int mid = (start + end) / 2;
  int left_node  = 2 * node;
  int right_node = 2 * node + 1;
  build_tree(left_node, start, mid);
  build_tree(right_node, mid + 1, end);
  tree[node] = max(tree[left_node], tree[right_node]);
}

void update_tree(int node, int start, int end, int x, int k){
  if(start == end){
    if(tree[node] < k){
      tree[node] = k;
    }
    return ;
  }
  int mid = (start + end) / 2;
  int left_node  = 2 * node;
  int right_node = 2 * node + 1;
  if(x <= mid){
    update_tree(left_node, start, mid, x, k);
  }
  else {
    update_tree(right_node, mid + 1, end, x, k);
  }
  tree[node] = max(tree[left_node], tree[right_node]);
}

int query_tree(int node, int start, int end, int L, int R){
  if(L <= start && end <= R){
    return tree[node];
  }
  int mid = (start + end) / 2;
  ans = INT_MIN;
  int left_node  = 2 * node;
  int right_node = 2 * node + 1;
  if(L <= mid){
    ans = max(ans, query_tree(left_node, start, mid, L, R));
  }
  if(R > mid) {
    ans = max(ans, query_tree(right_node, mid + 1, end, L, R));
  }
  return ans;
}

int main(){
  cin >> n >> m;
  for(int i = 1;i <= n;i++){
    cin >> a[i];
  }
  build_tree(1, 1, n);
  while(m--){
    char f;
    cin >> f;
    if(f == 'Q'){
      int a, b;
      cin >> a >> b;
      cout << query_tree(1, 1, n, a, b) << endl;
    } else {
      int a, b;
      cin >> a >> b;
      update_tree(1, 1, n, a, b);
    }
  }
  return 0;
}

2022/4/4 14:45
加载中...