Cod sursa(job #42829)

Utilizator gigi_becaliGigi Becali gigi_becali Data 29 martie 2007 15:53:28
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.97 kb
//(c) author Mircea Dima
// Arbori Indexati Binar
// datorii.cpp
#include <stdio.h>
#define maxn 50

int s[maxn], m, n;
int bit(int x)
  // returneaza 2^k unde k este cel mai nesemnificativ bit al lui x
{
  return (x & ( (x-1)^x));
}

void update(int x, int val, int sgn)
  // n<<1 = n*2 ; daca sgn e 1 atunci se aduna, daca e -1 se scade
{
  for(; x<=n ;x+=bit(x)) s[x]+=sgn*val;
}

int query(int x)
  // determina suma de la 1 la x
{
  int sum=0;
  for(; x>0 ;x-=bit(x))sum+=s[x];
  return sum;
}

void citire()
{
  int i;
  freopen("datorii.in", "r", stdin);
  freopen("datorii.out", "w", stdout);
  scanf("%d %d\n", &n, &m);
  for(i=1;i<=n;i++)
    {
      int x;
      scanf("%d ", &x);
      update(i, x, 1);
    }
  for(i=1;i<=m;i++)
    {
      int p, q, t;
      scanf("%d %d %d\n", &p, &q, &t);
      if(p==0) update(q, t, -1);
      else printf("%d\n", query(t)-query(q-1));
    }
}

int main()
{
  citire();
  return 0;
}