八十分TLE求调(玄关)
查看原帖
八十分TLE求调(玄关)
573963
wbh20090611楼主2024/8/13 10:08
#include <iostream>
using namespace std;
struct tree
{
	int num, l, r;
	tree *lef, *rig;
}*root[1000010];
int n, m, a[1000010], v, op, loc, val;
void build(tree *r)
{
	if (r->l == r->r)
	{
		r->num = a[r->l];
		return;
	}
	int mid = (r->l + r->r) >> 1;
	tree *ll, *rr;
	ll = new tree;
	rr = new tree;
	ll->l = r->l;
	rr->r = r->r;
	ll->r = mid;
	rr->l = mid + 1;
	build(ll);
	build(rr);
	r->lef = ll;
	r->rig = rr;
	r->num = ll->num + rr->num;
	return;
}
int query(tree *r, int x)
{
	if (r->l == r->r)
		return r->num;
	int mid = (r->l + r->r) >> 1;
	if (x > mid)
		return query(r->rig, x);
	return query(r->lef, x);
}
tree* update(tree *r, int x, int val)
{
	if (r->l == r->r)
	{
		tree *u = new tree;
		u->l = r->l;
		u->r = r->r;
		u->num = val;
		return u;
	}
	int mid = (r->l + r->r) >> 1;
	if (x > mid)
	{
		tree *u = new tree, *ll = update(r->rig, x, val);
		u->l = r->l;
		u->r = r->r;
		u->num = ll->num + r->lef->num;
		u->lef = r->lef;
		u->rig = ll;
		return u;
	}
	else
	{
		tree *u = new tree, *ll = update(r->lef, x, val);
		u->l = r->l;
		u->r = r->r;
		u->num = ll->num + r->rig->num;
		u->rig = r->rig;
		u->lef = ll;
		return u;
	}
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin >> n >> m;
	for (int i = 1; i <= n; i++)
		cin >> a[i];
	root[0] = new tree;
	root[0]->l = 1;
	root[0]->r = n;
	build(root[0]);
	for (int i = 1; i <= m; i++)
	{
		cin >> v >> op >> loc;
		if (op == 1)
		{
			cin >> val;
			root[i] = update(root[v], loc, val);
		}
		else
		{
			root[i] = root[v];
			cout << query(root[i], loc) << "\n";
		}
	}
}

评测记录

2024/8/13 10:08
加载中...