Cod sursa(job #330094)

Utilizator cristi12345Balu Cristian cristi12345 Data 8 iulie 2009 18:36:43
Problema Datorii Scor 40
Compilator fpc Status done
Runda Arhiva de probleme Marime 3.7 kb
program datorii;   
var f,g:text;   
        doi:array[0..60] of longint;   
        v:array[0..15001] of longint;   
        c:array[0..15001] of longint;   
        n,m:longint;   
  
  
  
procedure iofile;   
var i:longint;   
begin  
        assign(f,'datorii.in');   
        reset(f);   
        assign(g,'datorii.out');   
        rewrite(g);   
        readln(f,n,m);   
        for i:=1 to n do  
                begin  
                        read(f,v[i]);   
                        v[i]:=v[i]+v[i-1];   
                end;   
        fillchar(c,sizeof(c),0);   
end;   
  
procedure doila;   
var p,i:longint;   
begin  
        p:=1;   
        i:=0;   
        doi[i]:=p;   
        while p<=n do  
                begin  
                        inc(i);   
                p:=p*2;   
                doi[i]:=p;   
                end;   
end;   
  
procedure aib;   
var i,poz,s1,s2,ind,val,cod,st,dr,sum:longint;   
begin  
        for i:=1 to m do  
                begin  
                        read(f,cod);   
                        if cod=0 then  
                                begin  
                                        read(f,ind);   
                                        readln(f,val);   
                                        poz:=0;   
                                        while ind<=n do  
                                                begin  
                                                        c[ind]:=c[ind]+val;   
                                                        while ind and doi[poz]=0 do  
                                                                poz:=poz+1;   
                                                        ind:=ind+doi[poz];   
                                                        poz:=poz+1;   
                                                end;   
                                end else  
                                begin  
                                        read(f,st);   
                                        readln(f,dr);   
                                        poz:=0;   
                                        s1:=0;   
                                        sum:=v[dr]-v[st-1];   
                                        while dr>0 do  
                                                begin  
                                                        s1:=s1+c[dr];   
                                                        while dr and doi[poz]=0 do  
                                                                poz:=poz+1;   
                                                        dr:=dr-doi[poz];   
                                                        poz:=poz+1;   
                                                end;   
                                        s2:=0;   
                                        poz:=0;   
                                        st:=st-1;   
                                        while st>0 do  
                                                begin  
                                                        s2:=s2+c[st];   
                                                        while st and doi[poz]=0 do  
                                                                poz:=poz+1;   
                                                        st:=st-doi[poz];   
                                                        poz:=poz+1;   
                                                end;   
                                        writeln(g,sum-s1+s2);   
                                end;   
                end;   
        close(g);   
end;   
  
  
begin  
        iofile;   
        doila;   
        aib;   
end.