Pagini recente » Cod sursa (job #3322998) | Cod sursa (job #3243180) | Atasamentele paginii Arbori de intervale si aplicatii in geometria computationala | Cod sursa (job #3319093) | Cod sursa (job #3356635)
#include <algorithm>
#include <fstream>
#include <iostream>
#include <vector>
using namespace std;
ifstream fin("secv5.in");
ofstream fout("secv5.out");
class Secv5Solver {
public:
Secv5Solver(int n, int l, int u) : n(n), l_bound(l), u_bound(u), x(n) {}
void set_value(int i, unsigned val) { x[i] = val; }
long long solve() {
coordinate_compress();
return get_at_most(u_bound) - get_at_most(l_bound - 1);
}
private:
int n, l_bound, u_bound;
vector<unsigned> x;
void coordinate_compress() {
vector<pair<unsigned, int>> y(n);
for (int i = 0; i < n; ++i) {
y[i] = {x[i], i};
}
sort(y.begin(), y.end());
int current_id = 0;
for (int i = 0; i < n; ++i) {
if (i > 0 && y[i].first != y[i - 1].first) {
current_id++;
}
x[y[i].second] = current_id;
}
}
long long get_at_most(int k) {
if (k <= 0) {
return 0;
}
vector<int> freq(n, 0);
int distinct_count = 0, left = 0;
long long result = 0;
for (int right = 0; right < n; ++right) {
if (freq[x[right]]++ == 0) {
distinct_count++;
}
while (distinct_count > k) {
if (--freq[x[left++]] == 0) {
distinct_count--;
}
}
result += (right - left + 1);
}
return result;
}
};
int main() {
int n, l, u;
fin >> n >> l >> u;
Secv5Solver solver(n, l, u);
for (int i = 0; i < n; ++i) {
unsigned val;
fin >> val;
solver.set_value(i, val);
}
fout << solver.solve();
}