Cod sursa(job #289210)

Utilizator whiskeyOzzy Osbourne whiskey Data 26 martie 2009 15:59:24
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.78 kb
#include <stdio.h>
#include <vector>
using namespace std;

int n, pos, val, sum, seq_start, seq_end;
vector<int> arb;
vector<int> init;

void solve();
void insert(int, int, int);
void query(int, int, int);
void update(int, int, int);

int main()
{
	solve();
	return 0;
}

void solve()
{
	int m, x, y, z;
	FILE *fin = fopen("datorii.in", "r");
	FILE *fout = fopen("datorii.out", "w");
	fscanf(fin, "%d%d", &n, &m);
	arb.resize(4 * n);
	init.resize(n + 1);

	for (pos = 1; pos <= n; ++pos)
	{
		fscanf(fin, "%d", &val);
		insert(1, 1, n);
	}

	for (; m; --m)
	{
		fscanf(fin, "%d%d%d", &x, &y, &z);
		if (x)	//query
		{
//			printf("query: %d %d\n", y, z);
			seq_start = y;
			seq_end = z;
			sum = 0;
			query(1, 1, n);
			fprintf(fout, "%d\n", sum);
		}
		else	//update
		{
//			printf("update: pozitia %d, scad %d\n", y, z);
			pos = y;
			val = z;
			update(1, 1, n);
		}
/*		
		for (int i = 1; i <= 4 * n; ++i)
		{
			printf("%d ", arb[i]);
		}
		printf("\n");
*/	}

	fclose(fin);
	fclose(fout);
}

void query(int nod, int st, int dr)
{
	if (seq_start <= st && dr <= seq_end)
	{
		sum += arb[nod];
	}
	else
	{
		int mid = (st + dr) / 2;
		if (seq_start <= mid)
		{
			query(2 * nod, st, mid);
		}
		if (mid < seq_end)
		{
			query(2 * nod + 1, mid + 1, dr);
		}
	}
}

void insert(int nod, int st, int dr)
{
	if (st == dr)
	{
		arb[nod] = val;
		init[pos] = nod;
	}
	else
	{
		int mid = (st + dr) / 2;
		if (pos <= mid)
		{
			insert(2 * nod, st, mid);
		}
		else
		{
			insert(2 * nod + 1, mid + 1, dr);
		}
		arb[nod] = arb[2*nod] + arb[2*nod+1];
	}
}

void update(int nod, int st, int dr)
{
	if (st == dr)
	{
		arb[nod] -= val;
	}
	else
	{
		int mid = (st + dr) / 2;
		if (pos <= mid)
		{
			update(2 * nod, st, mid);
		}
		else
		{
			update(2 * nod + 1, mid + 1, dr);
		}
		arb[nod] = arb[2*nod] + arb[2*nod+1];
	}
}