Cod sursa(job #527971)

Utilizator elffikkVasile Ermicioi elffikk Data 1 februarie 2011 16:45:53
Problema Datorii Scor 0
Compilator fpc Status done
Runda Arhiva de probleme Marime 1.37 kb
var a:array[0..16,1..15000]of integer;
    i,j,k,n,m:integer; f1,f2:text;
    tip,x,y,s,P1,k1,j1:integer;

function log2(y:integer):integer;
var k,p:longint;
begin
 k:=0; p:=y;
 while p>0 do
 begin
   p:=p div 2;
   inc(k);
 end;
 log2:=k;
end;

function max(x,y:integer):integer;
begin
  if x<y then max:=y else max:=x;
end;

begin
  assign(f1, 'datorii.in');
  reset(f1);
  assign(f2, 'datorii.out');
  rewrite(f2);

  readln(f1,n,m);
  {
  writeln(n,' ',m);
  }
  for i:=1 to n do read(f1,a[0,i]);

  k:=1;
  while 1 shl k<n do inc(k);
  for j:=1 to k do
   for i:=1 to n do
   begin
     a[j,i]:=a[j-1,i];
     if 1 shl (j-1) + i<=n
     then a[j,i]:=a[j,i]+a[j-1,i+1 shl(j-1)];
   end;

  for j:=0 to k do
  begin
    for i:=1 to n do write(a[j,i]:3);
    writeln;
  end;

  for j:=1 to m do
  begin
    readln(f1,tip,x,y);
    if tip=1
    then
    begin
      s:=a[k,x];
      if y<n then s:=s-a[k,y];
      writeln(f2,s);
    end
    else
    begin
      k1:=0;
      while 1 shl k1 <x do
      begin
        for j1:=k1 to k do
          dec(a[j1,x+1-(1 shl k1)],y);
        inc(k1);
      end;
      if 1 shl k1 <>x
      then
        for j1:=k1 to k do
          dec(a[j1,1],y);
    end
  end;

  for j:=0 to k do
  begin
    for i:=1 to n do write(a[j,i]:3);
    writeln;
  end;

  close(f1);
  close(f2);
end.