Cod sursa(job #163578)

Utilizator marius21Petcu Marius marius21 Data 22 martie 2008 14:47:36
Problema Marbles Scor 0
Compilator fpc Status done
Runda preONI 2008, Runda Finala, Clasele 5-8 Marime 2.15 kb
type bile_de_la_stele=record
x:longint;
c:byte;
end;

var a,tmp:array[0..100001] of bile_de_la_stele;
b:array[0..100000,1..64]of longint;
c:array[1..64] of byte;
f,g:text;
nrc,max,nr1,nr2,ID,ii,jj,k,i,j,m,n:longint;

procedure sort(si,sj:longint);
var nr,m,i,j:longint;
begin
if si<sj then begin
  m:=(si+sj) div 2;
  sort(si,m);
  sort(m+1,sj);
  i:=si;
  j:=m+1;
  nr:=0;
  while(i<=m) and (j<=sj) do
    if a[i].x<a[j].x then begin
      inc(nr);
      tmp[nr]:=a[i];
      inc(i);
      end
      else begin
      inc(nr);
      tmp[nr]:=a[j];
      inc(j);
      end;
  while i<=m do begin
    inc(nr);
    tmp[nr]:=a[i];
    inc(i);
    end;
  while j<=sj do begin
    inc(nr);
    tmp[nr]:=a[j];
    inc(j);
    end;
  for i:=1 to nr do
    a[si+nr-1]:=tmp[nr];
  end;
end;

procedure searchbin(si,sj,src:longint; var ret:longint);
var m:longint;
begin
if si<=sj then begin
  m:=(si+sj) div 2;
  if (a[m-1].x<src) and (src<=a[m].x) then
    ret:=m
    else begin
    searchbin(si,m-1,src,ret);
    searchbin(m+1,sj,src,ret);
    end;
  end;
end;

procedure searchbin2(si,sj,src:longint; var ret:longint);
var m:longint;
begin
if si<=sj then begin
  m:=(si+sj) div 2;
  if (a[m].x<=src) and (src<a[m+1].x) then
    ret:=m
    else begin
    searchbin2(si,m-1,src,ret);
    searchbin2(m+1,sj,src,ret);
    end;
  end;
end;

begin
assign(f,'marbles.in');
assign(g,'marbles.out');
reset(f);
rewrite(g);
read(f,n,m);
a[0].x:=-maxlongint;
a[n+1].x:=maxlongint;
nrc:=0;
for i:=1 to n do begin
  read(f,a[i].x,a[i].c);
  if c[a[i].c]=0 then begin
    inc(nrc);
    c[a[i].c]:=nrc;
    end;
  a[i].c:=c[a[i].c];
  end;
sort(1,n);
for i:=1 to n do begin
  for j:=1 to nrc do
    b[i,j]:=b[i-1,j];
  inc(b[i,a[i].c]);
  end;
for k:=1 to m do begin
  read(f,ID,ii,jj);
  if ID=0 then begin
    searchbin(1,n,ii,nr1);
    a[nr1].x:=ii+jj;
    end;
  if ID=1 then begin
    searchbin(1,n,ii,nr1);
    searchbin2(1,n,jj,nr2);
    max:=0;
    for i:=1 to nrc do
      if max<b[nr2,i]-b[nr1-1,i] then
        max:=b[nr2,i]-b[nr1-1,i];
    writeln(g,max);
    end;
  end;
close(f);
close(g);
end.