Cod sursa(job #523664)

Utilizator cristiprgPrigoana Cristian cristiprg Data 18 ianuarie 2011 20:28:27
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
#include <cstdio>
#define DIM 15005

int arb[DIM],n, m;

void modifica(int ind, int val)
{
	int poz = 0;
	while (ind <= n)
	{ 
		arb[ind] += val;
		while ((ind & (1<<poz)) == 0)
			++poz;
		ind += (1<<poz);
		++poz;
	}
}

int suma(int st, int dr)
{
	int s1 = 0, poz = 0;
	while (dr > 0)
	{
		s1 += arb[dr];
		while ((dr & (1<<poz)) == 0)
			++poz;
		dr -= (1<<poz);
		++poz;
	}
	
	int s2 = 0;
	poz = 0;
	--st;
	while (st > 0)
	{
		s2 += arb[st];
		while ((st & (1<<poz)) == 0)
			++poz;
		st -= (1<<poz);
		++poz;
	}
	
	return s1-s2;
}

void afis()
{
	
	for (int i = 1; i <= n; ++i)
		printf("%3d ", i);
	printf("\n");
	for (int i = 1; i <= n; ++i)
		printf("%3d ", arb[i]);
	printf("\n");
	printf("||==================||\n");
}

int main()
{
	FILE *f = fopen("datorii.in", "r");
	fscanf(f, "%d%d", &n, &m);
	for (int i = 1, val; i <= n; ++i)
		fscanf(f, "%d", &val), modifica(i, val);
	
//	afis();
		
	FILE *out = fopen("datorii.out", "w");
	for (int type, a, b;m;--m)
	{
		fscanf(f, "%d%d%d", &type, &a, &b);
		if (type == 0)
			modifica(a, -b);
		else
			fprintf(out, "%d\n", suma(a, b));
	}
	
	fclose(f);
	fclose(out);
	
	return 0;
}