Cod sursa(job #6407)

Utilizator vanila0406Ionescu Victor vanila0406 Data 19 ianuarie 2007 13:27:28
Problema Datorii Scor 100
Compilator fpc Status done
Runda Arhiva de probleme Marime 3.45 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.