Pagini recente » Cod sursa (job #265994) | Cod sursa (job #333287) | Cod sursa (job #11999) | Cod sursa (job #2608926) | Cod sursa (job #327416)
Cod sursa(job #327416)
#include <cstdio>
#include <fstream>
#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];
long long Sol;
vector <unsigned int> H[MOD];
ifstream fin ("secv5.in");
ofstream fout ("secv5.out");
void citire()
{
fin >> N >> L >> U;
for(unsigned int i = 1; i <= N; ++i)
fin >> 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);
}
}
long long solve(unsigned int k)
{
memset(T, 0, sizeof T);
unsigned int nr = 0, li = 1, lf = 1;
long long sol = 0;
for( ;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()
{
citire();
norm();
Sol = solve(U) - solve(L-1);
fout << Sol;
}