Cod sursa(job #387078)

Utilizator Andrei_ScorpioAndreiana Andrei Daniel Andrei_Scorpio Data 26 ianuarie 2010 19:53:26
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.03 kb
#include<stdio.h>
#define max(a,b) a+b
#define Nmax 15010
int ar[4*Nmax],a,b,n,op,m,maxl;
int done=0;
void update(int val,int poz,int nod, int st,int dr)
{
	if(st==dr)
	{
		ar[nod]-=val;
		return;
	}
	int mij;
	mij=(st+dr)/2;
	if(poz<=mij)
		update(val,poz,2*nod,st,mij);
	else
		update(val,poz,2*nod+1,mij+1,dr);
	
	ar[nod]=max(ar[2*nod],ar[2*nod+1]);
}
void query(int nod, int st,int dr, int a, int b)
{
	if(st>=a && dr<=b)
	{
		maxl+=ar[nod];
		return;
	}
	int mij=(st+dr)/2;
	if(a<=mij)
		query(2*nod,st,mij,a,b);
	if(b>mij)
		query(2*nod+1,mij+1,dr,a,b);
		
}
int main()
{
	int x;
	freopen("datorii.in","r",stdin);
	freopen("datorii.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&x);
		update(-x,i,1,1,n);
	}
	done=1;
	for(int j=1;j<=m;j++)
	{	scanf("%d%d%d",&op,&a,&b);
		if(op==1)
		{
			maxl=0;
			query(1,1,n,a,b);//in loc de 1,n trebuie 1 si ultima pozitie din interval.
			printf("%d\n",maxl);
		}
		else
		{
			update(b,a,1,1,n);
		}
	}
	return 0;
}