求助 fhq-treap样例不过
查看原帖
求助 fhq-treap样例不过
519384
Link_Cut_Y楼主2022/1/27 18:40
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>

using namespace std;

const int N = 500010;

struct Tree
{
	int s[2], v, size, dat;
	int sum;
}tr[N];

int n, m;
int x, y, z;
int idx, root;

void pushup(int u)
{
	tr[u].size = tr[tr[u].s[0]].size + tr[tr[u].s[1]].size + 1;
	tr[u].sum = tr[tr[u].s[0]].sum + tr[tr[u].s[1]].sum;
}

void split(int u, int sz, int &x, int &y)
{
	if (!u) x = y = 0;
	else
	{
		if (tr[tr[u].s[0]].size + 1 <= sz) x = u, split(tr[u].s[1], sz - tr[tr[u].s[0]].size - 1, tr[u].s[1], y);
		else y = u, split(tr[u].s[0], sz, x, tr[u].s[0]);
		pushup(u);
	}
}

int merge(int a, int b)
{
	if (!a || !b) return a + b;
	if (tr[a].dat < tr[b].dat)
	{
		tr[a].s[1] = merge(tr[a].s[1], b);
		pushup(a);
		return a;
	}
	else
	{
		tr[b].s[0] = merge(a, tr[b].s[0]);
		pushup(b);
		return b;
	}
}

int init(int v)
{
	tr[ ++ idx].v = v, tr[idx].sum = v, tr[idx].size = 1, tr[idx].dat = rand();
	return idx;
}

void insert(int v)
{
	root = merge(root, init(v));
}

void modify(int u, int v)
{
	split(root, u - 1, x, y), split(y, 1, y, z);
	tr[y].v += v, tr[y].sum += v;
	pushup(y);
	root = merge(x, merge(y, z));
}

int query(int l, int r)
{
	split(root, l - 1, x, y), split(y, r - l + 1, y, z);
	int res = tr[y].sum;
	root = merge(x, merge(y, z));
	return res;
}

int main()
{
	cin >> n >> m;
	
	for (int i = 1; i <= n; i ++ )
	{
		int a;
		cin >> a;
		insert(a);
	}
	
	while (m -- )
	{
		int opt, l, r;
		cin >> opt >> l >> r;
		if (opt == 1) modify(l, r);
		else cout << query(l, r) << endl;
	}
	
	return 0;
}
2022/1/27 18:40
加载中...