Cod sursa(job #16024)

Utilizator adalLica Adela adal Data 11 februarie 2007 22:56:46
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define LSB(x) ((x)^((x)&(x-1)))
// LSB(x)=2^k, unde k=nr de 0-ouri din stanga reprezentarii binare..0-ori terminale
#define NMAX 32768

long a[NMAX],m,n,i,x,c1,c2,c,t,v,p,q;

FILE *f=fopen("datorii.in","r");
FILE *g=fopen("datorii.out","w");


void update( long x, long delta)
//adaug la elementul x valoarea delta in O(lg N),
// unde n e dimensiunea AIB-ului.
{
  for (; x < NMAX; x+=LSB(x))
     a[x]+=delta;
}

int query(int x) //calculez suma elementelor de la 1 la x in O(log N)
{
  int ret=0;
  for (; x>0; x-=LSB(x))
    ret+=a[x];
  return ret;
}

int main()
{
  fscanf(f,"%ld %ld\n", &n, &m);
  memset(a,0,sizeof(a));

  for (i=1; i<=n; i++)
  {
     fscanf(f,"%ld", &x);
     update(i,x);
  }

  for (i=1; i<=m; i++)
  {
    fscanf(f,"%ld",&x);
    if (x==0)
    { //  achitare
      fscanf(f,"%ld %ld\n",&t,&v);
      update(t,-v);
    }
    else
    { //  intrebare
      fscanf(f,"%ld %ld\n",&p,&q);
      c1=query(q); c2=query(p-1);
      c=c1-c2;
      fprintf(g,"%ld\n",c);
    }
  }


  return 0;
}