可持久化线段树求调
查看原帖
可持久化线段树求调
490978
小超手123楼主2023/7/3 11:54

全输出0。。。。

#include<bits/stdc++.h>
#define N 1000005
using namespace std;
struct node {
    int v, ls, rs; 
} t[N << 2];
int rt[N << 2], cnt;
int tot, n, m, a[N << 2];
void change(int lsto, int &o, int l, int r, int q, int v) { //a[q] += v;
    if(!o) o = ++cnt;
    if(l == r) {
        t[o].v = v;
        return;
	}
	int mid = (l + r) / 2;
	if(q <= mid) {
	    t[o].rs = t[lsto].rs;
	    t[o].ls = ++cnt;
	    t[t[o].ls] = t[t[lsto].ls];
	    change(t[lsto].ls, t[o].ls, l, mid, q, v);
	}
	else {
	    t[o].ls = t[lsto].ls;
	    t[o].rs = ++cnt;
	    t[t[o].rs] = t[t[lsto].rs];
	    change(t[lsto].rs, t[o].rs, mid + 1, r, q, v);
	}
} 
int query(int o, int l, int r, int x) {
    if(l == r) return t[o].v;
    int mid = (l + r) / 2;
    if(x <= mid) return query(t[o].ls, l, mid, x); // 说明第k小的数的值域是[l, mid] 
	else return query(t[o].rs, mid + 1, r, x); // 说明第k小的数的值域是[mid + 1, r] 
}
void add(int v) {
    rt[v] = ++cnt;
    t[rt[v]] = t[rt[1]];
}
int main() {
    cin >> n >> m;
    for(int i = 1; i <= n; i++) {
        cin >> a[i];
        change(rt[0], rt[1], 1, n, a[i], 1);
	}
	for(int i = 2; i <= n; i++) add(i);
	for(int i = 1; i <= m; i++) {
	    int v, opt, x, y;
	    cin >> v >> opt;
	    if(opt == 1) {
	        cin >> x >> y;
	        change(rt[1], rt[v], 1, n, x, y);
		}
		else {
		    cin >> x;
		    cout << query(rt[v], 1, n , x) << endl;
		}
	}
    return 0;
} 
2023/7/3 11:54
加载中...