Cod sursa(job #190619)

Utilizator antoanelaAntoanela Siminiuc antoanela Data 23 mai 2008 17:21:07
Problema Marbles Scor 0
Compilator fpc Status done
Runda Arhiva de probleme Marime 2.58 kb
program marbles;
var f,g:text;
    v:array[1..70]of 0..1;
    a,b:array[0..100010]of longint;
    k,y,z,c,s,s2,n,m,i,p1,j,mo,p2,max:longint;

function poz(li,ls:longint):longint;
var i,j,modi,modj,m,man:longint;
begin
i:=li;
j:=ls;
modi:=0;
modj:=-1;
while (i<=j)do
  begin
    if (a[i]>a[j])then
      begin
        man:=a[i];
        a[i]:=a[j];
        a[j]:=man;
        man:=b[i];
        b[i]:=b[j];
        b[j]:=man;
        m:=modi;
        modi:=-modj;
        modj:=-m;
      end;
    i:=i+modi;
    j:=j+modj;
  end;
poz:=i;
end;
procedure quick(li,ls:longint);
begin
if (li<ls)then
  begin
    k:=poz(li,ls);
    quick(li,k-1);
    quick(k+1,ls);
  end;
end;

function bin1(p1:longint;p2:longint;p:longint):longint;
var k,ok:longint;
begin
  ok:=0;
  while (p1<=p2)do
    begin
      k:=(p1+p2)div 2;
      if (a[k]>p)then p2:=k-1 else
      if (a[k]<p)then p1:=k+1 else
      if (a[k]=p)then
        begin
          bin1:=k;
          ok:=1;
          break;
        end;
    end;
  if (ok=0)then
    if (a[k]>p)then dec(k);
  bin1:=k;
end;

function bin2(p1:longint;p2:longint;p:longint):longint;
var k,ok:longint;
begin
  ok:=0;
  while (p1<=p2)do
    begin
      k:=(p1+p2)div 2;
      if (a[k]>p)then p2:=k-1 else
      if (a[k]<p)then p1:=k+1 else
      if (a[k]=p)then
        begin
          bin2:=k;
          ok:=1;
          break;
        end;
    end;
  if (ok=0)then
    if (a[k]<p)then inc(k);
  bin2:=k;
end;

begin
assign(f,'marbles.in');
assign(g,'marbles.out');
reset(f);
rewrite(g);
read(f,n,m);
for i:=1 to n do read(f,a[i],b[i]);
for i:=1 to m do
  begin
    read(f,k,y,z);
    if (k=0)then
      begin
        p1:=bin1(1,n,y);
        c:=0;
        a[p1]:=y+z;
        s:=a[p1];
        s2:=b[p1];
        for j:=p1 downto 1 do
          if (a[j]<a[p1])then
            begin
              for y:=p1-1 downto j+1 do
                begin
                  a[y+c]:=a[y];
                  b[y+c]:=b[y];
                end;
              a[j+1]:=s;
              b[j+1]:=s2;
            end else inc(c);
      end else
      begin
        p1:=bin2(1,n,y);
        if (z>y)then
          p2:=bin1(p1+1,n,z) else
          p2:=bin1(1,p1-1,z);
        for j:=1 to max do v[j]:=0;
        max:=0;
        for j:=p1 to p2 do
          begin
            inc(v[b[j]]);
            if (b[j]>max)then max:=b[j];
          end;
        mo:=0;
        for j:=1 to max do
          if (v[j]>mo)then mo:=v[j];
        writeln(G,mo);
      end;
  end;
close(f);
close(g);
end.