Cod sursa(job #523669)

Utilizator cristiprgPrigoana Cristian cristiprg Data 18 ianuarie 2011 20:59:25
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
#include <cstdio>
#define DIM 100005

int arb[DIM],n, m, sum[DIM];
void afis();


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

}

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 cautare(int val, int st, int dr)
{
	if (st >= dr)
	{
		if (sum[st] == val)
			return st;
		if (sum[dr] == val)
			return dr;
		return -1;
	}
	
	int mij = (st+dr)/2;
	if (val <= sum[mij])
		cautare(val, st, mij);
	else
		cautare(val, dr, mij+1);
}

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