Cod sursa(job #45725)

Utilizator g3ppyStoian Vlad g3ppy Data 1 aprilie 2007 20:31:08
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.02 kb
#include <stdio.h>
#include <math.h>
#define NRM 15000
FILE *fin,*fout;

long n,m,i,l,val,ind,poz,x,dr,st,s1,s2;

int a[NRM];

int query(int x)
{
    int r = 0;
    for (; x; x -= x ^ (x-1) & x)
	r += a[x];
    return r;
}

void update(int x, int v)
{
      for (; x <= n; x += x^(x-1) & x)
	  a[x] += v;
}


int main()

{

fin=fopen("datorii.in","rt");
fout=fopen("datorii.out","wt");

fscanf(fin,"%ld %ld",&n,&m);
for (i=1;i<=n;i++)
 {
 fscanf(fin,"%ld",&val);

   ind=i;
   poz=0;
   x=1;
   while (ind<=n)
   {
   a[ind]=a[ind]+val;
   x*=2;

   while ((ind&x)==0)
	 {
	 poz++;
	 x*=2;
	 }
   ind=ind+x;
   poz++;
   }



 }
for (i=1;i<=m;i++)
    {
    fscanf (fin,"%ld",&l);
    if (l==1)
       {
       fscanf(fin,"%ld %ld",&st,&dr);
       s1=query(dr);
       s2=query(st-1);
       fprintf(fout,"%ld\n",s1-s2);
       }

    else
      {
       fscanf(fin,"%ld %ld",&ind,&val);
       update(ind,val);
      }

    }


fprintf(fout,"\n");

return 0;
}