Cod sursa(job #380818)

Utilizator Magnuscont cu nume gresit sau fals Magnus Data 7 ianuarie 2010 20:36:26
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.76 kb
#include <stdio.h>
#include <math.h>
#include <stdlib.h>

long long v[33001];

inline long long query(long long nod,long long s,long long d,long long l,long long r)
{
	if ((d<l)||(s>r)) return 0;
	if ((l<=s)&&(d<=r)) return v[nod];
	int a,b;
	a=query(2*nod,s,(s+d)/2,l,r);
	b=query(2*nod+1,(s+d)/2+1,d,l,r);
	return a+b;
}

int main()
{
	long long i=1,j,x=2,n,m,a,b,c;
	freopen("datorii.in","r",stdin);
	freopen("datorii.out","w",stdout);
	scanf("%lld%lld",&n,&m);
	do
	{
		x*=2;
	}
	while (n>x);
	for (i=x;i<x+n;i++) scanf("%lld",&v[i]);
	for (i=x-1;i>0;i--) v[i]=v[2*i]+v[2*i+1];
	for (i=1;i<m+1;i++)
	{
		scanf("%lld%lld%lld",&a,&b,&c);
		if (a==0) for (j=x+b-1;j>0;j=j/2) v[j]-=c;
		else printf("%lld\n",query(1,1,x,b,c));
	}
	return 0;
}