Pagini recente » Cod sursa (job #1668997) | Cod sursa (job #324818) | Cod sursa (job #2670599) | Cod sursa (job #2733067) | Cod sursa (job #1256404)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <deque>
const int MOD = 666013;
class Hash {
private:
std::vector<int> a[MOD];
public:
int size;
int different;
Hash() {
size = 0;
different = 0;
}
void insert(int x) {
int i = x % MOD;
bool ok = false;
for (size_t j = 0; j < a[i].size(); j++) {
if (a[i][j] == x) {
ok = true;
break;
}
}
if (ok == false) {
different++;
}
size++;
a[i].push_back(x);
}
void erase(int x) {
int i = x % MOD;
for (size_t j = 0; j < a[i].size(); j++) {
if (a[i][j] == x) {
a[i].erase(a[i].begin() + j);
size--;
break;
}
}
bool ok = false;
for (size_t j = 0; j < a[i].size(); j++) {
if (a[i][j] == x) {
ok = true;
break;
}
}
if (ok == false) {
different--;
}
}
};
std::ifstream f("secv5.in");
std::ofstream g("secv5.out");
Hash hmin, hmax;
std::queue<int> qmin, qmax;
int main()
{
int n, mn, mx;
f >> n >> mn >> mx;
int sol = 0;
for (int i = 1; i <= n; i++) {
int x; f >> x;
hmin.insert(x);
hmax.insert(x);
qmin.push(x);
qmax.push(x);
if (hmax.different < mn) {
continue;
}
while (hmin.different >= mn) {
hmin.erase(qmin.front());
qmin.pop();
}
while (hmax.different > mx) {
hmax.erase(qmax.front());
qmax.pop();
}
sol += (qmax.size() - qmin.size());
}
g << sol << std::endl;
f.close();
g.close();
return 0;
}