刚学主席树,40ptrWA求助!
查看原帖
刚学主席树,40ptrWA求助!
234964
2408727188GHR楼主2022/11/17 22:59
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define mid ((l + r) >> 1)
#define endl '\n'

struct node {
	ll sum, toadd;
	int lc, rc;
	node(int _l = 0, int _r = 0, ll s = 0, ll t = 0) :lc(_l), rc(_r), sum(s), toadd(t) {}
};
vector<node>tr;
vector<int> root;
int n, m, tot = 1;

void pull_up(int idx) {
	tr[idx].sum = tr[tr[idx].lc].sum + tr[tr[idx].rc].sum;
}

void change(int copy, int idx, int l, int r, int target, ll val) {
	if (l == r) {
		tr[idx].sum = val;
		return;
	}
	tr[idx].lc = tr[copy].lc;
	tr[idx].rc = tr[copy].rc;
	if (target <= mid) {
		tr[idx].lc = ++tot;
		change(tr[copy].lc, tr[idx].lc, l, mid, target, val);
	} else {
		tr[idx].rc = ++tot;
		change(tr[copy].rc, tr[idx].rc, mid + 1, r, target, val);
	}
}
void change(int ver, int target, ll val) {
	root.push_back(++tot);
	change(root[ver], root.back(), 1, n, target, val);
}

ll ask(int idx, int l, int r, int target) {
	if (l == r) {
		if (l != target)
			cerr << "error" << endl;
		return tr[idx].sum;
	}
	if (target <= mid)
		return ask(tr[idx].lc, l, mid, target);
	else
		return ask(tr[idx].rc, mid + 1, r, target);
}
ll ask(int ver, int target) {
	return ask(root[ver], 1, n, target);
}

void init() {
	cin >> n >> m;
	vector<ll> tmp(n + 1);
	tr.resize(n * 30);
	root.push_back(tot);
	for (int i = 1; i <= n; i++)
		cin >> tmp[i];
	function<void(int, int, int)> build = [&](int idx, int l, int r) -> void {
		if (l == r) {
			tr[idx].sum = tmp[l];
			return;
		}
		tr[idx].lc = ++tot;
		tr[idx].rc = ++tot;
		build(tr[idx].lc, l, mid);
		build(tr[idx].rc, mid + 1, r);
		pull_up(idx);
	};
	build(1, 1, n);
}

int main() {
	FILE *stream;
	freopen_s(&stream, "P3919_6.in", "r", stdin);
	freopen_s(&stream, "out.txt", "w", stdout);
	ios::sync_with_stdio(0);
	cin.tie(nullptr); cout.tie(nullptr);
	init();
	for (int i = 1; i <= m; i++) {
		int ver, opt, idx;
		cin >> ver >> opt >> idx;
		if (opt == 1) {
			int val; cin >> val;
			change(ver, idx, val);
		} else {
			ll tmp = ask(ver, idx);
			cout << tmp << endl;
			root.push_back(root.back());
			if (tmp == -418986049)
				cerr << i << " " << ver << " " << idx << endl;
		}
	}
}
2022/11/17 22:59
加载中...