Cod sursa(job #595258)

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

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

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

int 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 == dr)
		AI[nod] -= v;
	if(st < dr)
	{
		AI[nod] -= v;
		if( t <= mij )
			update(lf , st , mij , t , v);
		else
			update(rf , mij + 1 , dr , t , v); 
	}
}

int querry(int nod,int st,int dr,int a,int b)
{
	int 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<=M;i++)
	{
		fscanf(f,"%d %d %d",&stare,&a,&b);
		for(int i=1;i<=20;i++)
			printf("%d ",AI[i]);
		if(!stare)
			update(1,1,N,a,b);
		else
			fprintf(g,"%d\n",querry(1,1,N,a,b));
		printf("\n");
	}
	
	fclose(g);
	fclose(f);
	return 0;
}