Pagini recente » Cod sursa (job #2504311) | Cod sursa (job #377096) | Cod sursa (job #3287437) | Cod sursa (job #2608925) | Cod sursa (job #327409)
Cod sursa(job #327409)
#include <cstdio>
#include <vector>
using namespace std;
#define MAX_N 1100000
#define MOD 666013
unsigned int N, L, U, K;
unsigned int V[MAX_N], T[MAX_N], A[MAX_N];
unsigned int Sol;
vector <int> H[MOD];
void citire()
{
scanf("%u %u %u",&N, &L, &U);
for(int i = 1; i <= N; ++i)
scanf("%u",V+i);
}
void insert(int i)
{
int k = V[i] % MOD;
H[k].push_back(i);
}
int find(int x)
{
int k = x % MOD;
for(vector <int> ::iterator it = H[k].begin(); it != H[k].end(); ++it)
if(V[*it] == x)
return *it;
return 0;
}
void norm()
{
for(int i = 1; i <= N; ++i)
{
A[i] = A[find(V[i])];
if(A[i]) continue;
A[i] = ++K;
insert(i);
}
}
unsigned int solve(int k)
{
memset(T, 0, sizeof T);
int nr = 1, li = 1, lf = 1;
unsigned int sol = 1;
T[A[1]] = 1;
for(++lf ;lf <= N; ++lf)
{
++T[A[lf]];
if(T[A[lf]] == 1) ++nr;
while(1)
{
if(nr <= k) break;
--T[A[li]];
if(T[A[li]] == 0) --nr;
++li;
}
sol += (lf - li + 1);
}
return sol;
}
int main()
{
freopen("secv5.in","rt",stdin);
freopen("secv5.out","wt",stdout);
citire();
norm();
Sol = solve(U) - solve(L-1);
printf("%u\n",Sol);
}