Cod sursa(job #163609)

Utilizator radu_voroneanuVoroneanu Radu Stefan radu_voroneanu Data 22 martie 2008 14:48:39
Problema Marbles Scor 100
Compilator fpc Status done
Runda preONI 2008, Runda Finala, Clasele 5-8 Marime 2.31 kb
type bila=record
     x:longint;
     cul:longint;
     end;

var a,b:array[1..100001] of bila;
    f,g:text;
    w,e,apar,schimb,n,m,i,j,op,max,x1,x2:longint;
    ap:array[0..65] of longint;

procedure inter(st,dr,mij:longint);
 var i,j,t,k:longint;
 begin
  for i:=st to dr do
   b[i]:=a[i];
  i:=st;
  j:=mij+1;
  k:=st;
  while (i<=mij) and (j<=dr) do begin
   if (b[i].x<b[j].x) then begin
    a[k]:=b[i];
    inc(i);
   end
   else begin
    a[k]:=b[j];
    inc(j);
   end;
   inc(k);
  end;
  for t:=i to mij do
   a[t+k-i]:=b[t];
  for t:=j to dr do
   a[t+k-j]:=b[t];
 end;

procedure merge(st,dr:longint);
 var mij:longint;
 begin
  if st<dr then begin
   mij:=(st+dr) shr 1;
   merge(st,mij);
   merge(mij+1,dr);
   inter(st,dr,mij);
  end;
 end;


function cauta1(st,dr:longint):longint;
 var mij:longint;
 begin
  if st<=dr then begin
   mij:=(st+dr) shr 1;
   if (a[mij].x>=w) and ((a[mij-1].x<w) or (mij=1)) then
    cauta1:=mij
   else
    if a[mij].x<w then
     cauta1:=cauta1(mij+1,dr)
    else
     cauta1:=cauta1(st,mij-1);
  end
  else
   cauta1:=0;
 end;

function cauta2(st,dr:longint):longint;
 var mij:longint;
 begin
  if st<=dr then begin
   mij:=(st+dr) shr 1;
   if (a[mij].x<=e) and ((a[mij+1].x>e) or (mij=n)) then
    cauta2:=mij
   else
    if a[mij].x>e then
     cauta2:=cauta2(st,mij-1)
    else
     cauta2:=cauta2(mij+1,dr);
  end
  else
   cauta2:=0;
 end;

function cauta(st,dr:longint):longint;
 var mij:longint;
 begin
  if st<=dr then begin
   mij:=(st+dr) shr 1;
   if a[mij].x=w then
    cauta:=mij
   else
    if a[mij].x<w then
     cauta:=cauta(mij+1,dr)
    else
     cauta:=cauta(st,mij-1);
  end;
 end;

begin
 assign(f,'marbles.in'); reset(f);
 assign(g,'marbles.out'); rewrite(g);
 read(f,n,m);
 for i:=1 to n do
  read(f,a[i].x,a[i].cul);
 merge(1,n);
 for i:=1 to m do begin
  read(f,op);
  if op=0 then begin
   read(f,w,schimb);
   schimb:=schimb+w;
   apar:=cauta(1,n);
   a[apar].x:=schimb;
  end
  else begin
   read(f,w,e);
   for j:=1 to 64 do
    ap[j]:=0;
   x1:=cauta1(1,n);
   x2:=cauta2(1,n);
   for j:=x1 to x2 do
    inc(ap[a[j].cul]);
   max:=0;
   for j:=1 to 64 do
    if ap[j]>max then
     max:=ap[j];
   writeln(g,max);
  end;
 end;
 close(f); close(g);
end.