Cod sursa(job #726769)

Utilizator hiticas_abelhiticasabel hiticas_abel Data 27 martie 2012 15:08:21
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#include<fstream>
const int lg=100005;
int init[lg],t[4*lg],a,b,rez;

inline int max(int a, int b)
{
return a>b?a:b;
}

//construire arbore
void construiesc(int st, int dr, int poz)
{

	if(st==dr)
	{
	 init[st]=poz;
	 return;
	}
	int x=(st+dr)/2;
	construiesc(st,x,2*poz);
	construiesc(x+1,dr,2*poz+1);
}
//***Actualizare***
void actualizez(int poz, int val)
{
   int x=init[poz];
       t[x]=t[x]+val;
	   x>>=1;
	   while(x)
	   {
	   t[x]=t[x]+val;
	   x>>=1;
	   }
}

void actualizez2(int poz, int val)
{
   int x=init[poz];
       t[x]=t[x]-val;
	   x>>=1;
	   while(x)
	   {
	   t[x]=t[x]-val;
	   x>>=1;
	   }
}
//***Interogare***
void interogare(int st, int dr, int poz)
{
	if(st>b || dr<a)  return;
	if( a<=st&& dr<=b )
		rez+=t[poz];
	else
		if(st<dr)
		{
		int x=(st+dr)/2;
		interogare(st, x,poz*2);
		interogare(x+1,dr,poz*2+1);
		}
}

int main()
{
int i,x,n,m;
freopen ("datorii.in","r",stdin);
freopen ("datorii.out","w",stdout);
	scanf("%d %d",&n,&m);
	construiesc(1,n,1);
	

	for(i=1;i<=n;i++)
	{
	  scanf("%d",&x);
	  actualizez(i,x);  
	}
	
	for(i=1;i<=m;i++)
	{
	  scanf("%d %d %d",&x,&a,&b);
	    if(x==1)
		{
		rez=0;
		interogare(1,n,1);
		printf("%d\n",rez);
		}
	else
		if(x==0)
		actualizez2(a,b);
	}

	
	
	return 0;
	
}