Pagini recente » Cod sursa (job #1307540) | Cod sursa (job #1194840) | Monitorul de evaluare | Cod sursa (job #428876) | Cod sursa (job #797579)
Cod sursa(job #797579)
#include <fstream>
#include <cstring>
using namespace std;
const int N = 1 << 20, K = 1299827;
struct HashTable{
unsigned int hash[K];
int h(unsigned int x, int i){
return (x + i * i) % K;
}
bool hash_here(unsigned int x, int i){
int q = h(x, i);
return !hash[q] || hash[q] == x;
}
int get_key(unsigned int x){
int i = 0;
while (hash[h(x, i)] != x)
i++;
return h(x, i);
}
void insert(unsigned 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;
}
int main(){
int L, U;
unsigned int x;
in >> n >> L >> U;
for (int i = 1 ; i <= n ; i++){
in >> x; H.insert(x);
v[i] = H.get_key(x);
}
out << solve(U) - solve(L - 1) << "\n";
return 0;
}