Cod sursa(job #526349)

Utilizator gicu_01porcescu gicu gicu_01 Data 28 ianuarie 2011 02:34:35
Problema Datorii Scor 0
Compilator fpc Status done
Runda Arhiva de probleme Marime 1.24 kb
var a:array[0..14]of longint;
    b:array[0..14,1..100000]of longint;
    n,m:longint;

procedure putere;
var i:byte;
begin
 for i:=0 to 14 do begin a[i]:=1shl(i); write(a[i],' '); end;
 writeln;
end;

procedure matrice;
var i,j:longint;
begin
 for i:=1 to 14 do
  for j:=1 to n do
   if j+a[i-1]<=n then b[i,j]:=b[i-1,j]+b[i-1,j+a[i-1]] else b[i,j]:=b[i-1,j];
end;

function interval(x,y:longint):longint;
var k,p,i:longint;
begin
 k:=y-x+1; p:=0;
 for i:=14 downto 0 do
  begin
   if k div a[i]=1 then begin p:=p+b[i,x]; k:=k mod a[i]; x:=x+a[i]; end;
   if k=0 then break;
  end;
 interval:=p;
end;

procedure scadere(x,y:longint);
var k,p,i,j:longint;
begin
 i:=0;
 while k>1 do
  begin
   k:=x-a[i]+1;
   b[i,k]:=b[i,k]-y;
   inc(i);
  end;
 j:=1;
 while p>1 do
  begin
   p:=x-a[j]+2;
   b[j,p]:=b[j,p]-y;
   inc(j);
  end;
end;

procedure citire;
var i,x,y,z:longint;f,t:text;
begin
 assign(f,'datorii.in');
 reset(f);
 readln(f,n,m);
 assign(t,'datorii.out');
 reset(t);
 for i:=1 to n do read(f,b[0,i]);
 matrice;
 for i:=1 to m do
  begin
   readln(x,y,z);
   if x=0 then scadere(y,z) else writeln(t,interval(y,z));
  end;
 close(t);
 close(f);
end;


begin
 putere;
 citire;
end.