Cod sursa(job #797578)
#include <fstream>
#include <cstring>
using namespace std;
const int N = 1 << 20, K = 1299827;
struct HashTable{
int hash[K];
int h(int x, int i){
return (x + i * i) % K;
}
bool hash_here(int x, int i){
int q = h(x, i);
return !hash[q] || hash[q] == x;
}
int get_key(int x){
int i = 0;
while (hash[h(x, i)] != x)
i++;
return h(x, i);
}
void insert(int val){
int i = 0;
while (!hash_here(val, i))
i++;
hash[h(val, i)] = val;
}
};
struct CountingTable{
int v[N], size;
void reset(){
memset(v, 0, sizeof(v));
size = 0;
}
void insert(int x){
if (!v[x])
++size;
++v[x];
}
void erase(int x){
--v[x];
if (!v[x])
--size;
}
};
HashTable H;
CountingTable T;
int v[N], n;
ifstream in("secv5.in");
ofstream out("secv5.out");
int solve(int D){
T.reset();
int sol = 0;
for (int i = 1, j = 0 ; i <= n ; i++){
while (j <= n && T.size <= D)
T.insert(v[++j]);
sol += j - i;
T.erase(v[i]);
}
return sol;
}
void normalise(int v[], int n){
for (int i = 1 ; i <= n ; i++)
H.insert(v[i]);
for (int i = 1 ; i <= n ; i++)
v[i] = H.get_key(v[i]);
}
int main(){
int L, U;
in >> n >> L >> U;
for (int i = 1 ; i <= n ; i++)
in >> v[i];
normalise(v, n);
out << solve(U) - solve(L - 1) << "\n";
return 0;
}