Cod sursa(job #783272)

Utilizator RaileanuCristian Raileanu Raileanu Data 2 septembrie 2012 14:35:49
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
#include<fstream>
using namespace std;

ifstream f1("datorii.in");
ofstream f2("datorii.out");
         
long n,m, i,j, cod,t,v, a[15010], c[15010];

long nz(long x){
    long nr;
    for (nr=1; x%2==0; nr*=2, x/=2);
    return (nr); }

void modificare(long t, long v){
                    while (t<=n) 
                          { c[t]-=v;
                            t+=nz(t); }   
                            }                   

void interogare(long st, long dr) {
                    long p, smd, sms;
                    for (p=st-1, sms=0;p ; p-=nz(p)) sms+=c[p];
                    for (p=dr, smd=0; p ; p-=nz(p)) smd+=c[p];
                    f2<<smd-sms<<"\n"; }; 

int main(){
         f1>>n>>m;
         for (i=1;i<=n;i++)
             f1>>a[i];
         
         int sm;  
         for (i=1; i<=n; i++)
             if (i%2!=0) c[i]=a[i];
             else { for (sm=0,j=i-nz(i)+1;j<=i; j++) sm+=a[j];
                    c[i]=sm; };
                    
         for (i=1; i<=m; i++)
             { f1>>cod>>t>>v;
               if (cod) interogare(t,v);
               else modificare(t,v); };
         f1.close();
         f2.close();
         return 0;
         }