Cod sursa(job #713986)

Utilizator RoswenRus Alexandru Roswen Data 15 martie 2012 11:05:33
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.09 kb
#include<stdio.h>
#define N 15005
FILE *f=fopen("datorii.in","r"), *g=fopen("datorii.out","w");
int n, a[N*4+N/2], start, final, pos, maxim, left, right ,m, val, test;
void update(int nod, int left, int right)
{
	if(left==right)
	{
		if(a[nod]) a[nod]-=val;
		else a[nod]=val;
		return;
	}
	
	int div=left+(right-left)/2;
	if( pos <= div)
		update(2*nod, left, div);
	else update(2*nod+1, div+1, right);
	
	a[nod]=a[nod*2]+a[nod*2+1];
}

void caut(int nod, int left, int right)
{
	if( start<= left && right <= final)
	{
		maxim+=a[nod];
		return ;		
	}
	int div= left + (right-left)/2;
	if(start <= div)
		caut(2*nod, left, div);
	if(div< final)
		caut(2*nod+1, div+1, right);
}
int main()
{
	fscanf(f,"%d %d" , &n, &m);
	for(int i=1; i<=n;i++)
	{
		fscanf(f,"%d", &val);
		pos=i;
		update(1,1,n);
	}
	for(int i=1;i<=m;i++)
	{
		fscanf(f,"%d", &test);
		if(test==0)
		{
			fscanf(f,"%d %d", &pos, &val);
			update(1,1,n);
		}
		else
		{
			fscanf(f,"%d %d", &start, &final);
			maxim=0;
			caut(1,1,n);
			
			fprintf(g,"%d\n", maxim);
		}
	}
	return 0;
}