Cod sursa(job #1043148)

Utilizator sp3ct3rFMI Dima Robert sp3ct3r Data 28 noiembrie 2013 01:42:11
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2 kb
#include <iostream>
using namespace std;

struct nod
{
	int sum;
	nod *left, *right;
};

void Add(int*, int, int, nod*);
void Update(nod*, int, int, int, int);
int Find(nod*, int, int, int, int);

int main()
{
	int N, M, rVal, rVal2;
	int *partSum;
	freopen("datorii.in", "r", stdin);
	freopen("datorii.out", "w", stdout);
	cin >> N >> M;

	partSum = new int[N];
	cin >> partSum[0];
	for (int i = 1; i < N; i++)
	{
		cin >> partSum[i];
		partSum[i] += partSum[i - 1];
	}

	nod *idxTree = new nod;
	idxTree->left = idxTree->right = NULL;
	Add(partSum, 0, N - 1, idxTree);
	delete partSum;

	for (int i = 0; i < M; i++)
	{
		cin >> rVal;
		if (rVal == 0)
		{
			cin >> rVal >> rVal2;
			Update(idxTree, 0, N - 1, rVal - 1, rVal2);
		}
		else if (rVal == 1)
		{
			cin >> rVal >> rVal2;
			cout << Find(idxTree, 0, N - 1, rVal - 1, rVal2 - 1) << endl;
		}
	}
	return 0;
}

void Add(int *pS, int s, int n, nod* iT)
{
	if (s - 1 < 0)
		iT->sum = pS[n];
	else
		iT->sum = pS[n] - pS[s - 1];

	if (n - s == 0)
		return;

	if (!iT->left)
	{
		iT->left = new nod;
		iT->left->left = iT->left->right = NULL;
	}
	Add(pS, s, (n + s) / 2, iT->left);
	if (!iT->right)
	{
		iT->right = new nod;
		iT->right->left = iT->right->right = NULL;
	}
	Add(pS, (n + s) / 2 + 1, n, iT->right);
}

void Update(nod *iT, int s, int n, int p, int val)
{
	if (s == p && p == n)
	{
		iT->sum -= val;
		return;
	}
	if (s <= p && p <= (n + s) / 2)
	{
		Update(iT->left, s, (n + s) / 2, p, val);
	}
	else if (p > (n + s) / 2 && p <= n)
	{
		Update(iT->right, (n + s) / 2 + 1, n, p, val);
	}
	iT->sum = iT->left->sum + iT->right->sum;
}

int Find(nod *iT, int s, int n, int ps, int pn)
{
	int res = 0;
	int m = (n + s) / 2;
	if (s == ps && n == pn)
		return iT->sum;
	if (s <= ps && ps <= m)
	{
		res += Find(iT->left,
			s,
			m,
			ps,
			pn < m ? pn : m);
	}
	if (pn >m)
	{
		res += Find(iT->right,
			m + 1,
			n,
			ps > m ? ps : m + 1,
			pn);
	}
	return res;
}