Cod sursa(job #10610)

Utilizator goguGogu Marian gogu Data 28 ianuarie 2007 19:33:39
Problema Secventa 5 Scor 10
Compilator fpc Status done
Runda Arhiva de probleme Marime 1.46 kb
var a, nr1, nr2:array[0..1 shl 20] of longint;
val:array[0..1 shl 20] of qword;
i,j,k,n,m,p,u:longword;
sol:int64;

procedure sort(l,r: longint);
var i,j:longint;
x,y:qword;
begin
i:=l; j:=r;
x:=val[(l+r) div 2];
repeat
 while val[i]<x do inc(i);
 while x<val[j] do dec(j);
 if (i<=j) then
       begin
       y:=val[i]; val[i]:=val[j]; val[j]:=y;
       inc(i); dec(j);
       end;
until i>j;
if (l<j) and (val[l]<val[j]) then sort(l,j);
if (i<r) and (val[i]<val[r]) then sort(i,r);
end;

procedure solve; inline;
var dif1, dif2, p1, p2:longint;
begin
dif1:=0; dif2:=0;
p1:=0; p2:=0;
for i:=1 to n do
 begin
 if i>1 then
        begin
        dec(nr1[a[i-1]]);
        if (nr1[a[i-1]]=0) then dec(dif1);
        dec(nr2[a[i-1]]);
        if (nr2[a[i-1]]=0) then dec(dif2);
        end;
 while (dif1<p) and (p1<n) do
  begin
  inc(p1);
  if (nr1[a[p1]]=0) then inc(dif1);
  inc(nr1[a[p1]]);
  end;
 while (p2<n) and ((dif2<u) or (nr2[a[p2+1]]>0)) do
  begin
  inc(p2);
  if (nr2[a[p2]]=0) then inc(dif2);
  inc(nr2[a[p2]]);
  end;
 if (dif1=p) then inc(sol, p2-p1+1);
 end;
writeln(sol);
end;

begin
assign(input,'secv5.in'); reset(input);
assign(output,'secv5.out'); rewrite(output);
readln(n, p, u);
for i:=1 to n do
 begin
 read(k);
 val[i]:=qword(k) shl 22+i;
 end;
sort(1,n);
for i:=1 to n do
 begin
 if (val[i-1] shr 22 <> val[i] shr 22) then inc(m);
 a[val[i] and (1 shl 22-1)]:=m;
 end;
solve;
close(output);
end.