Cod sursa(job #76728)

Utilizator coderninuHasna Robert coderninu Data 11 august 2007 01:22:05
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <stdio.h>
#define infile "datorii.in"
#define outfile "datorii.out"

long *a, *c, n, m, i, j;

long nr_zero(long);
void index();
void scade(long,long);
long suma(long,long);
long putere(long);

int main()
{
 long x, y, z;
 freopen(infile, "r", stdin);
 freopen(outfile, "w", stdout);
 scanf("%ld %ld\n", &n, &m);
 a=new long [n+1];
 c=new long [n+1];
 for (i=0; i<=n; i++) c[i]=0;
 for (i=1; i<=n; i++) scanf("%ld ", &a[i]);
 index();
 for (i=0; i<m; i++)
     {
      scanf("%ld %ld %ld\n", &x, &y, &z);
      if (x==0) scade(y,z);
      else printf("%ld\n", suma(y,z));
     }
 fclose(stdin);
 fclose(stdout);
 return 0;
}

long nr_zero(long x)
{
 long temp=0;
 while (!(x%2))
     {
      x/=2;
      temp++;
     }
 return temp;
}

long putere(long x)
{
 if (x==0) return 1;
 long A=1;
 for (long ii=1; ii<=x; ii++) A*=2;
 return A;
}

void index()
{
 long temp, aux;
 for (i=1; i<=n; i++)
     {
      aux=putere(nr_zero(i));
      for (j=i; j>=i-aux+1; j--)
	  c[i]+=a[j];
     }
}

void scade(long x, long y)
{
 while (x<=n)
     {
      c[x]-=y;
      x+=putere(nr_zero(x));
     }
}

long suma(long x, long y)
{
 long temp=0, temp2=0;
 x--;
 while (x)
     {
      temp+=c[x];
      x-=putere(nr_zero(x));
     }
 while (y)
     {
      temp2+=c[y];
      y-=putere(nr_zero(y));
     }
 return temp2-temp;
}