Cod sursa(job #197138)

Utilizator adrianraduleaRadulea Adrian adrianradulea Data 1 iulie 2008 20:50:12
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.89 kb
#include<stdio.h>
#include<math.h>
FILE *f,*g;
int a[15001],baza[15001],j,p,op,q,n;
long i,v[15001],suma,s1,s2,m;
int baza2(int n)
{ int x=0;
  while(n!=0)
   { if(n%2==0) x++; else return x;
     n/=2;
   }
  return x;
}
int main()
{ f=fopen("datorii.in","r"); g=fopen("datorii.out","w");
  fscanf(f,"%d%ld",&n,&m);
  for(i=1;i<=n;i++) { fscanf(f,"%d",&a[i]); a[i]=a[i]+a[i-1]; }
  for(i=1;i<=n;i++)
   { baza[i]=pow(2,baza2(i));
     v[i]=a[i]-a[i-baza[i]];
   }
  for(i=1;i<=m;i++)
   { fscanf(f,"%d",&op);
     if(op==0)
      { fscanf(f,"%d%d",&j,&suma);
	while(j<=n)
	 { v[j]=v[j]-suma;
	   j=j+baza[j];
	 }
      }
     else if(op==1)
      { fscanf(f,"%d%d",&p,&q);
	j=q; s1=0; s2=0;
	while(j!=0)
	 { s1=s1+v[j];
	   j=j-baza[j];
	 }
	j=p-1;
	while(j!=0)
	 { s2=s2+v[j];
	   j=j-baza[j];
	 }
	fprintf(g,"%ld\n",s1-s2);
      }
   }
  fclose(g);
  return 0;
}