Pagini recente » Cod sursa (job #1461024) | Cod sursa (job #904146) | Cod sursa (job #1111045) | Cod sursa (job #3192545) | Cod sursa (job #656008)
Cod sursa(job #656008)
#include <cstdio>
#include <vector>
#define NMax 100005
#define U 666013
#define x first
#define n second
using namespace std;
vector < pair <unsigned, int> > H[U];
int N, S, NDistinct, L[2], Limit[2][NMax];
unsigned V[NMax];
inline void Insert (unsigned X)
{
int Key=X%U;
for (unsigned i=0; i<H[Key].size (); ++i)
{
if (H[Key][i].x==X)
{
++H[Key][i].n;
return;
}
}
++NDistinct;
H[Key].push_back (make_pair (X, 1));
}
inline void Delete (unsigned X)
{
int Key=X%U;
for (vector < pair <unsigned, int> > :: iterator i=H[Key].begin (); i!=H[Key].end (); ++i)
{
if ((*i).x==X)
{
--(*i).n;
if ((*i).n==0)
{
--NDistinct;
H[Key].erase (i);
}
return;
}
}
}
void Read ()
{
freopen ("secv5.in", "r", stdin);
scanf ("%d %d %d", &N, &L[0], &L[1]);
--L[0];
for (int i=1; i<=N; ++i)
{
scanf ("%ud", &V[i]);
}
}
void Print ()
{
freopen ("secv5.out", "w", stdout);
printf ("%d\n", S);
}
void SolveL (int K)
{
Limit[K][0]=1;
for (int i=1; i<=N; ++i)
{
Limit[K][i]=Limit[K][i-1];
Insert (V[i]);
while (NDistinct>L[K])
{
Delete (V[Limit[K][i]]);
++Limit[K][i];
}
if (K==0)
{
S-=(i-Limit[K][i]+1);
}
else
{
S+=(i-Limit[K][i]+1);
}
}
int Left=Limit[K][N];
while (Left<=N)
{
Delete (V[Left]);
++Left;
}
}
int main()
{
Read ();
SolveL (0);
SolveL (1);
Print ();
return 0;
}