Cod sursa(job #199198)

Utilizator swxxIoo Andrei Rares swxx Data 17 iulie 2008 14:46:38
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 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);  

   }