Cod sursa(job #10100)

Utilizator bigsarpeadrian bigsarpe Data 27 ianuarie 2007 21:15:53
Problema Secventa 5 Scor 70
Compilator fpc Status done
Runda Arhiva de probleme Marime 2.1 kb
const maxn=1 shl 20;maxarb=maxn shl 1;
var t:Text;
   V:Array[0..maxn]of longint;
   Mark,Arb:array[0..maxarb]of longint;
   pas,n,la,lb,i,lg,last:longint;s:string;
   Procedure Mergesort(lo,hi:longint;var a,b:array of longint);
   var i,j,juma,lg:longint;
   begin
      if lo=hi then A[lo]:=lo else
      begin
         juma:=(lo+hi)div 2;mergesort(lo,juma,b,a);mergesort(juma+1,hi,b,a);
         i:=lo;j:=juma+1;
         for lg:=lo to hi do if(j>hi)or(i<=juma)and(V[B[i]]<=V[b[j]]) then
         begin A[lg]:=B[i];inc(i);end else begin A[lg]:=B[j];inc(j);end;
      end;
   end;
   Procedure act(nod,lo,hi,loc,cine:longint);
   var juma:longint;
   begin
      if lo=hi then
      begin
         inc(mark[nod],cine);Arb[nod]:=0;if mark[nod]>0 then arb[nod]:=1;
      end else
      begin
         juma:=(lo+hi)div 2;
         if loc<=juma then act(nod*2,lo,juma,loc,cine)
         else act(nod*2+1,juma+1,hi,loc,cine);
         arb[nod]:=arb[nod*2+1]+arb[nod*2];
      end;
   end;
   function get(limit:longint):int64;
   var nr,pas,i:longint;return:int64;
   begin
      fillchar(arb,sizeof(arb),0);
      return:=0;i:=0;nr:=0;
      for pas:=0 to N do
      begin
         while (i<=N)and(nr<=limit)do
         begin if arb[V[i]]=0 then inc(nr);inc(arb[V[i]]);inc(i);end;
         inc(return,i-1-pas);
         if nr<=limit then inc(return);
         dec(Arb[V[pas]]);if arb[V[pas]]=0 then dec(nr);
      end;
      get:=return;
   end;
{   var t1:longint;t2:longint absolute $0:$046c;}
begin
{   t1:=t2;}
   assign(T,'secv5.in');reset(T);readln(T,n,la,lb);dec(n);last:=-1;lg:=-1;
   for i:=0 to N do
   begin
      readln(t,s);
      for pas:=1 to length(s) do V[i]:=V[i]*10+ord(S[pas])-ord('0');
   end;close(T);
{   writeln((T2-t1)/18.2:0:6);}
   MergeSort(0,N,Mark,Arb);
{   writeln((T2-t1)/18.2:0:6);}
   for i:=0 to N do if V[Mark[i]]=last then V[Mark[i]]:=lg else
   begin inc(lg);last:=V[mark[i]];V[mark[i]]:=lg;end;
   writeln(get(lb));
   writeln(get(la-1));
   assign(t,'secv5.out');rewrite(T);writeln(t,get(lb)-get(la-1));close(t);
{   writeln((T2-t1)/18.2:0:6);}
end.