Cod sursa(job #1043318)

Utilizator hellol30FMI Macovei Daniel hellol30 Data 28 noiembrie 2013 13:13:39
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.91 kb
#include<cstdio>
using namespace std;
int n,x,y,t,op,k,ss,dd,tip=1;
int arb[4*15020];
void push(int,int,int);
void maxi(int,int,int);
int main()
{
	freopen("datorii.in","r",stdin);
	freopen("datorii.out","w",stdout);
	scanf("%d%d",&n,&t);
	for(dd=1;dd<=n;dd++)
	{
		scanf("%d",&ss);
		push(1,1,n);
	}
	tip=0 ;
	for(int i=1;i<=t;i++)
	{
		scanf("%d%d%d",&op,&dd,&ss);
		if(!op)
		{
			push(1,1,n);
		}
		else
		{
			k = 0;
			maxi(1,1,n);
			printf("%d\n",k);
		}
	}
	return 0;
}
void push(int nod, int s, int d)
{
	if( s==d ) 
	{
		if(tip) arb[nod]+=ss;
		  else arb[nod]-=ss;
		return ;
	}
	int m=(s+d)/2;
	if(dd <= m) push(2*nod, s ,m);
	  else push(2*nod+1,m+1,d);
	arb[nod]= arb[2*nod+1]+ arb[2*nod];
}
void maxi(int nod, int s, int d)
{
	if( dd <= s && d<=ss)
	{
		k+=arb[nod];
		return ;
	}
	int m=(s+d)/2;
	if(dd<=m) maxi(2*nod, s ,m);
	if(m<ss) maxi(2*nod+1, m+1, d);
}