Cod sursa(job #113678)

Utilizator coderninuHasna Robert coderninu Data 11 decembrie 2007 00:12:55
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.88 kb
#include <stdio.h>
#define Nmax 15001


int n, i, j, ii;
long m, c[Nmax], k, val, a, p, q;
long suma(long p, long q);

int main()
{
	freopen("datorii.in", "r", stdin);
	freopen("datorii.out", "w", stdout);
	scanf("%d %ld\n", &n, &m);
	for (i=1; i<=n; i++)
	{
		scanf("%ld ", &val);
		if (val){
		c[i]+=val;
		for ( j=i; j<=n; )
		{
			for (k=1; !(j&k); k<<=1);
			j+=k;
			if (j<=n) c[j]+=val;
		}}

	}

	for (; m; m--)
	{
		scanf("%ld %ld %ld\n", &a, &p, &q);
		if (a==1) printf( "%ld\n", suma(p,q) );
		else
		{
			c[p]-=q;
			for (; p<=n; )
			{
				for (k=1; !(k&p); k<<=1); p+=k;
				if (p<=n) c[p]-=q;
			}
		}
	}

	return 0;
}

long suma(long p, long q)
{
	long st=c[--p],dr=c[q];
	for (;q;)
	{
		for (k=1; !(k&q); k<<=1); q-=k;
		if (q) dr+=c[q];
	}
	for (;p;)
	{
		for (k=1; !(k&p); k<<=1); p-=k;
		if (p) st+=c[p];
	}
	return dr-st;
}