Cod sursa(job #69373)

Utilizator randommanThe Randomizer randomman Data 2 iulie 2007 20:41:42
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
/* Ivan Nicolae - Bucuresti */
/* Datorii - Arbori Indexati Binar */
#include <stdio.h>

#define NMAX 15001
#define _fin  "datorii.in"
#define _fout "datorii.out"

int i,n,C[NMAX],m;

void Aduna(int i, int x)
{
 int poz=i;

 while (poz <= n)
      {
       C[poz]+=x;
       poz += poz ^ (poz-1) & poz;
      }
}

void Scade(int i, int x)
{
 int poz=i;

 while (poz <= n)
      {
       C[poz]-=x;
       poz += poz ^ (poz-1) & poz;
      }
}

int Query(int i, int j)
{
 int R1=0,R2=0,poz=i-1;

 while (poz > 0)
      {
       R1+=C[poz];
       poz -= poz ^ (poz-1) & poz;
      }
 poz=j;
 while (poz > 0)
      {
       R2+=C[poz];
       poz -= poz ^ (poz-1) & poz;
      }
 return (R2-R1);
}

int main(void)
{
 freopen(_fin,"r",stdin);
 freopen(_fout,"w",stdout);

 scanf("%d%d",&n,&m);
 for (i=1;i<=n;i++)
    {
     int x;
     scanf("%d",&x);
     Aduna(i,x);
    }

 for (i=1;i<=m;i++)
    {
     int x,y,z;
     scanf("%d%d%d",&x,&y,&z);
     if (!x) Scade(y,z);
       else printf("%d\n",Query(y,z));
    }

 fclose(stdin);
 fclose(stdout);
 return 0;
}