Pagini recente » Cod sursa (job #323678) | Cod sursa (job #269270) | Cod sursa (job #2502819) | Cod sursa (job #2606770) | Cod sursa (job #327412)
Cod sursa(job #327412)
#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 long int Sol;
vector <unsigned int> H[MOD];
void citire()
{
scanf("%u %u %u",&N, &L, &U);
for(unsigned int i = 1; i <= N; ++i)
scanf("%u",V+i);
}
void insert(unsigned int i)
{
int k = V[i] % MOD;
H[k].push_back(i);
}
unsigned int find(unsigned int x)
{
int k = x % MOD;
for(vector <unsigned int> ::iterator it = H[k].begin(); it != H[k].end(); ++it)
if(V[*it] == x)
return *it;
return 0;
}
void norm()
{
for(unsigned int i = 1; i <= N; ++i)
{
A[i] = A[find(V[i])];
if(A[i]) continue;
A[i] = ++K;
insert(i);
}
}
unsigned long int solve(unsigned int k)
{
memset(T, 0, sizeof T);
unsigned int nr = 1, li = 1, lf = 1;
unsigned long 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("%lu\n",Sol);
}