Cod sursa(job #356483)

Utilizator SheepBOYFelix Liviu SheepBOY Data 14 octombrie 2009 21:55:34
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.83 kb
#include<stdio.h>
#define NMAX 100100
int n,m,arb[NMAX],pos[NMAX];
int s[15001];
int x,y;
void Generate_arb(int,int,int);
void Update(int,int,int,int,int);
void Gen(int,int,int);
int Question(int,int,int);
int main()
{
    int i,aux;
	freopen("datorii.in","r",stdin);
	freopen("datorii.out","w",stdout);
	scanf("%d%d",&n,&m);
	Gen(1,1,n);
	for(i=1;i<=n;++i)
	{
		scanf("%d",&aux);
		if(i>1)
             s[i]+=s[i-1]+aux;
		else
            s[i]=aux;
	}
	Generate_arb(1,n,1);
	for(i=1;i<=n;++i)
    {
                     scanf("%d%d%d",&aux,&x,&y);
                     if(aux)
                            printf("%d\n",Question(1,n,1));
                     else
                         Update(y,x,1,n,1);
    }
	return 0;
}
void Generate_arb(int st,int dr,int nd)
{
     bool exit=0;
     if(st==dr)
               exit=1;
     if(st>1)
             arb[nd]=s[dr]-s[st-1];     
     else
             arb[nd]=s[dr];
     if(exit)
             return;
     int m=(st+dr)>>1;
         Generate_arb(st,m,nd<<1);
         Generate_arb(m+1,dr,(nd<<1)+1);        
}
int Question(int st,int dr,int nod)
{
     if(y<st||x>dr)
                   return 0;
     if(st==dr)
               return arb[nod];
     int m=(st+dr)>>1;
     int a,b;
     a=Question(st,m,nod<<1);
     b=Question(m+1,dr,(nod<<1)+1);
     return a+b;
}
void Update(int val,int pover,int st,int dr,int nod)
{
     bool exit=0;
	 arb[nod]-=val;
     if(st==dr)
               exit=1;
     if(exit)
             return;
     int m=(st+dr)>>1;
     if(pover<=m)
                     Update(val,pover,st,m,nod<<1);
     else
                     Update(val,pover,m+1,dr,(nod<<1)+1);
}
void Gen(int p,int st,int dr)
{
	if(st==dr)
	{
		pos[st]=p;
		return ;
	}
	int m=(st+dr)>>1;
	
		Gen(2*p,st,m);
		Gen(2*p+1,m+1,dr);
}