Cod sursa(job #190690)

Utilizator antoanelaAntoanela Siminiuc antoanela Data 23 mai 2008 20:33:58
Problema Marbles Scor 10
Compilator fpc Status done
Runda Arhiva de probleme Marime 2.84 kb
program marbles;
var f,g:text;
    v:array[1..70]of longint;
    a,b:array[0..100010]of longint;
    x,k,y,z,n,m,i,p1,j,mo,p2,max,aux:longint;

function part(p,r:longint):longint;
var x,i,j,aux:longint;
begin
  x:=v[p];
  i:=p-1;
  j:=r+1;
  while true do
    begin
      repeat dec(j);
        until v[j]<=x;
      repeat inc(i);
        until v[i]>=x;
      if (i<j)then
        begin
          aux:=v[i];
          v[i]:=v[j];
          v[j]:=aux;
        end else
        begin
          part:=j;
          break;
        end;
    end;
end;

procedure quick(p,r:longint);
var q,i:longint;
begin
  if (p<r)then
    begin
      q:=part(p,r);
      quick(p,q);
      quick(q+1,r);
    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,x,y,z);
    if (x=0)then
      begin
        p1:=bin1(1,n,y);
        if (a[p1]=y)then a[p1]:=y+z;
        if (a[p1]=a[p1+1])then
          begin
            for j:=p1+2 to n do
              begin
                a[j-1]:=a[j];
                b[j-1]:=b[j];
              end;
            dec(n);
          end else
        if (a[p1]=a[p1-1])then
          begin
            for j:=p1 to n  do
              begin
                a[j-1]:=a[j];
                b[j-1]:=b[j];
              end;
            dec(n);
          end;
      end else
      begin
        if (y>z)then
          begin
            aux:=y;
            y:=z;
            z:=aux;
          end;
        p1:=bin2(1,n,y);
        p2:=bin1(p1+1,n,z);
        for j:=1 to 70 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];
        if (a[p1]>z)then writeln(g,0) else
        if (a[p2]<y)then writeln(g,0)else
        writeln(G,mo);
      end;
  end;
close(f);
close(g);
end.