Cod sursa(job #595237)

Utilizator maritimCristian Lambru maritim Data 11 iunie 2011 18:16:16
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
#include<stdio.h>

#define MaxN 700100
#define lf 2 * nod
#define rf 2 * nod + 1
#define mij ( st + dr ) / 2

long long AI[MaxN];
int A[15100];
int N;
int M;
int stare;
int a;
int b;

long long build(int nod,int st,int dr)
{
	if(st == dr)
		AI[nod] = A[st];
	else
		AI[nod] += build(lf,st,mij) + build(rf,mij + 1 , dr);
	return AI[nod];
}

int update(int nod,int st,int dr,int t,int v)
{
	if(st<=t && t<=dr)
		AI[nod] -= v;
	else if( t <= mij )
		update(lf,st,mij,t,v);
	else
		update(rf , mij + 1 , dr , t , v); 
}

long long querry(int nod,int st,int dr,int a,int b)
{
	long long sum = 0;
	if(a <= st && dr <= b)
		return AI[nod];
	if(a <= mij)
		sum += querry(lf , st , mij , a , b);
	if(mij < b)
		sum += querry(rf , mij + 1 , dr , a , b);
	return sum;
}

int main()
{
	FILE *f = fopen("datorii.in","r");
	FILE *g = fopen("datorii.out","w");
	
	fscanf(f,"%d %d",&N,&M);
	for(int i=1;i<=N;i++)
		fscanf(f,"%d ",&A[i]);
	build(1,1,N);
//	for(int i=1;i<=11;i++)
//		printf("%3d ",AI[i]);
	for(int i=1;i<=M;i++)
	{
		fscanf(f,"%d %d %d",&stare,&a,&b);
		if(!stare)
			update(1,1,N,a,b);
		else
			fprintf(g,"%llu\n",querry(1,1,N,a,b));
	}
	
	fclose(g);
	fclose(f);
	return 0;
}