求助主席树RE
查看原帖
求助主席树RE
363006
wangyibo201026楼主2022/4/1 16:03

代码:

#include<bits/stdc++.h>
#define int long long

using namespace std;

const int N = 1e6 + 5;
const int M = N * 20;

int n, m;
int a[N];

int tot;     //节点个数
int len, root[M];  //所有版本的根节点

struct segment_tree{
  int lt, rt;    //代表区间
  int l, r;   //左右孩子
  int v;    //代表值
}tree[M];

void pushup(int node){
  tree[node].v = tree[tree[node].l].v + tree[tree[node].r].v;
}

void build(int node, int lt, int rt){
  if(lt == rt){
    tree[node].lt = lt, tree[node].rt = rt;
    tree[node].v = a[lt];
    return ;
  }
  int mid = lt + rt >> 1;
  tot = max(tot, node << 1 | 1);
  tree[node].l = node << 1, tree[node].r = node << 1 | 1;
  build(node << 1, lt, mid);
  build(node << 1 | 1, mid + 1, rt);
  pushup(node);
}

void update(int node, int x, int k){
  if(tree[node].lt == tree[node].rt){
    tot++;
    tree[tot].lt = tree[node].lt, tree[tot].rt = tree[node].rt;
    tree[tot].v = tree[node].v + k;
  }
  tot++;
  tree[tot].lt = tree[node].lt, tree[tot].rt = tree[node].rt;
  tree[tot].v = tree[node].v + k;
  int mid = tree[node].lt + tree[node].rt >> 1;
  if(tree[node].lt <= x && x <= mid){
    tree[tot].l = tot + 1, tree[tot].r = tree[node].r;
    update(tree[node].l, x, k);
  }
  else{
    tree[tot].l = tree[node].l, tree[tot].r = tot + 1;
    update(tree[node].r, x, k);
  }
}

int query(int node, int x){
  if(tree[node].lt == tree[node].rt){
    return tree[node].v;
  }
  int mid = tree[node].lt + tree[node].rt >> 1;
  if(tree[node].lt <= x && x <= mid){
    return query(tree[node].l, x);
  }
  else{
    return query(tree[node].r, x);
  }
}

void Solve(){
  cin >> n >> m;
  for(int i = 1; i <= n; i++){
    cin >> a[i];
  }
  root[++len] = 1;
  build(1, 1, n);
  while(m--){
    int v, op;
    cin >> v >> op;
    v++;
    if(op == 1){
      int x, k;
      cin >> x >> k;
      root[++len] = tot + 1;
      update(root[v], x, k);
    }
    else{
      int x;
      cin >> x;
      len++;
      root[len] = root[len - 1];
      cout << query(root[v], x) << '\n';
    }
  }
}

signed main(){
  Solve();
  return 0;
}

由于本人是直接凭感觉打完的,所以可能会有一些奇异的问题。

2022/4/1 16:03
加载中...