Cod sursa(job #196083)

Utilizator vanila_CPPIonescu Victor Cristian vanila_CPP Data 24 iunie 2008 14:21:34
Problema Arbori de intervale Scor 0
Compilator fpc Status done
Runda Arhiva educationala Marime 1.67 kb
const maxn = 100010;
var arb : array[1..maxn*4+1] of longint;
    v : array[1..maxn+1] of longint;
    maxim,n,m,z,aux,q,a,b,i,x : longint;
    f,g : text;
    c : char;
    s : array[1..1000000] of char;
function max(x,y : longint):longint;
begin
  if x>y then max:=x else max:=y;
end;

procedure get_max(p,u,nr : longint);
var m : longint;
begin
  if (a<=p)and(u<=b) then
    maxim:=max(maxim,arb[nr])
  else
  begin
    m:=(p+u)shr 1;
      if(a<=m)then get_max(p,m,nr shl 1);
      if(b>m)then get_max(m+1,u,nr shl 1+1);
  end;
end;

procedure modify(a,p,u,nr : longint);
var m : longint;
begin
  if p=u then arb[nr]:=b
  else
  begin
    m:=(p+u)shr 1;
      if (a<=m) then modify(a,p,m,nr shl 1)
      else modify(a,m+1,u,nr shl 1+1);
    arb[nr]:=max(arb[nr shl 1],arb[nr shl 1+1]);
  end;
end;

begin
  assign(f,'arbint.in');reset(f);
  assign(g,'arbint.out');rewrite(g);
  readln(f,n,m);
  z:=0;aux:=0;
    while not eof(f) do
    begin
      while not eoln(f) do
      begin
        inc(z); read(f,c);
        s[z]:=c;
      end;
      inc(z); s[z]:=' ';
      readln(f);
    end;

    for i:=1 to z do
      if s[i]=' ' then
      begin
        inc(q);
        v[q]:=aux;
        aux:=0;
      end
      else
        aux:=aux*10+ord(s[i])-48;
    inc(q);
    v[q]:=aux;

    for a:=1 to n do
    begin
      b:=v[a];
      modify(a,1,n,1);
    end;
    i:=n+1;
    while i<q do
    begin
      x:=v[i];a:=v[i+1];b:=v[i+2];
      inc(i,3);
        if x<>0 then modify(a,1,n,1)
        else
        begin
          maxim:=0;
          get_max(1,n,1);
          writeln(g,maxim);
        end;
    end;
  close(g);
end.