Cod sursa(job #527930)

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

function log2(y:longint):longint;
var k,p:longint;
begin
 k:=0; p:=y;
 while p>0 do
 begin
   p:=p div 2;
   inc(k);
 end;
 log2:=k;
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-1 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-1 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:=0;
      while x<=y do
      begin
        k1:=log2(y-x+1);
        s:=s+a[k1-1,x];
        x:=x+(1 shl (k1-1));
      end;
      writeln(f2,s);
    end
    else
    begin
      a[0,x]:=a[0,x]-y;
      k1:=0;
      while x-(1 shl k1)>0 do
      begin
       for j1:=k1+1 to k-1 do
         dec(a[j1,x-(1 shl k1)], y);
       inc(k1);
      end;
    end
  end;
  {
  for j:=0 to k-1 do
  begin
    for i:=1 to n do write(a[j,i]:3);
    writeln;
  end;
  }
  close(f1);
  close(f2);
end.