Cod sursa(job #129184)

Utilizator DITzoneCAdrian Diaconu DITzoneC Data 28 ianuarie 2008 18:59:21
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.81 kb
#include <stdio.h>

typedef long long lint;

void adaug(lint i,lint x,lint n,lint sum[])
  {
      lint j;
      for(j=i;j<=n;j=j+(((j^(j-1))+1)>>1))
	sum[j]+=x;
  }

lint suma(lint i,lint sum[])
  {
     lint aux,j;
     for(aux=0,j=i;j;j=j&(j-1))
       aux+=sum[j];
     return(aux);
  }

int main()
  {
     FILE *fi=fopen("datorii.in","r"),
	  *fo=fopen("datorii.out","w");
     lint sum[15001],n,i,m,j,i1,i2;
     fscanf(fi,"%ld %ld",&n,&m);
     for(i=0;i<=n;sum[i++]=0);
     for(i=1;i<=n;i++)
       {
	  fscanf(fi,"%ld",&j);
	  adaug(i,j,n,sum);
       }
     for(i=1;i<=m;i++)
       {
	  fscanf(fi,"%ld %ld %ld",&j,&i1,&i2);
	  if (j==0) adaug(i1,-i2,n,sum);
	  else fprintf(fo,"%ld\n",suma(i2,sum)-suma(i1-1,sum));
       }
     fclose(fi);
     fclose(fo);
     return(0);
  }