线段树求调!
查看原帖
线段树求调!
519573
Daniel_yao楼主2022/4/4 10:52
#include<bits/stdc++.h>
using namespace std;
const int N = 500005;
int n, m;
long long a[N], tree[4*N];

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] = tree[left_node] + tree[right_node];
}

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

int query_tree(int node, int start, int end, int L, int R){
  if(R < start || L > end){
    return 0;
  }
  else if(L <= start && end <= R){
    return tree[node];
  }
  else if(start == end){
    return tree[node];
  }
  int mid = (start + end) / 2;
  int left_node  = 2 * node;
  int right_node = 2 * node + 1;
  int sum_left  = query_tree(left_node, start, mid, L, R);
  int sum_right = query_tree(right_node, mid + 1, end, L, R);
  return sum_left + sum_right;
}

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

他不给我输出?

2022/4/4 10:52
加载中...