Cod sursa(job #198118)

Utilizator mariussMarius Telespan mariuss Data 8 iulie 2008 16:37:25
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.09 kb
#include<stdio.h>
#define nmax 15005
int v[3*nmax],val[nmax];

void build(int x, int y, int p)
{
	if(x==y)
	{
		v[p]=val[x];
		return;
	}
	
	int mij=(x+y)>>1;
	
	build(x,mij,p<<1);
	build(mij+1,y,(p<<1)+1);
	
	v[p]=v[p<<1]+v[(p<<1)+1];
	
}

void update(int x, int y, int p, int a, int b)
{
	if(x=y)
	{
		v[p]-=b;
		return;
	}
	
	int mij=(x+y)>>1;
	
	if(a<=mij) update(x,mij,p<<1,a,b);
	if(mij+1<=a) update(mij+1,y,(p<<1)+1,a,b);
	
	v[p]=v[p<<1]+v[(p<<1)+1];
}

long long query(int x, int y, int p, int a, int b)
{
	if(a<=x && y<=b)
		return v[p];
		
	int mij=(x+y)>>1;
	long long s=0;
	
	if(a<=mij) s=query(x,mij,p<<1,a,b);
	if(mij+1<=b) s+=query(mij+1,y,(p<<1)+1,a,b);
	
	return s;
}


int main()
{
	int n,m,f,a,b,i;
	
	freopen("datorii.in","r",stdin);
	freopen("datorii.out","w",stdout);
	
	scanf("%d %d",&n,&m);
	
	for(i=1;i<=n;i++)	
		scanf("%d",&val[i]);
	
	build(1,n,1);
	
	for(i=1;i<=m;i++)
	{
		scanf("%d %d %d",&f,&a,&b);
		if(f==0)
			update(1,n,1,a,b);
		else
			printf("%lld\n",query(1,n,1,a,b));
			
	}
	
	return 0;
	
}