Pagini recente » Cod sursa (job #3344387) | Monitorul de evaluare | Diferente pentru summer-challenge-2 intre reviziile 3 si 2 | Cod sursa (job #3222806) | Cod sursa (job #3355866)
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
int s(const vector<int>& unice, int x) {
int st = 0;
int dr = (int)unice.size() - 1;
while (st <= dr) {
int mij = st + (dr - st) / 2;
if (unice[mij] == x) {
return mij;
}
if (unice[mij] < x) {
st = mij + 1;
} else {
dr = mij - 1;
}
}
return -1;
}
int comp(vector<int>& v) {
vector<int> copie = v;
sort(copie.begin(), copie.end());
vector<int> unice;
if (!copie.empty()) {
unice.push_back(copie[0]);
for (size_t i = 1; i < copie.size(); ++i) {
if (copie[i] != copie[i - 1]) {
unice.push_back(copie[i]);
}
}
}
for (size_t i = 0; i < v.size(); ++i) {
v[i] = s(unice, v[i]);
}
return (int)unice.size();
}
long long calc(const vector<int>& v, int k, int maxim) {
if (k <= 0) return 0;
long long raspuns = 0;
int stanga = 0;
int diferite = 0;
vector<int> fr(maxim, 0);
for (int dreapta = 0; dreapta < (int)v.size(); ++dreapta) {
if (fr[v[dreapta]] == 0) {
diferite++;
}
fr[v[dreapta]]++;
while (diferite > k) {
fr[v[stanga]]--;
if (fr[v[stanga]] == 0) {
diferite--;
}
stanga++;
}
raspuns += (dreapta - stanga + 1);
}
return raspuns;
}
int main() {
ifstream fin("secv5.in");
ofstream fout("secv5.out");
int n, l, u;
fin >> n >> l >> u;
vector<int> v(n);
for (int i = 0; i < n; ++i) {
fin >> v[i];
}
int limita = comp(v);
long long sus = calc(v, u, limita);
long long jos = calc(v, l - 1, limita);
fout << sus - jos << "\n";
return 0;
}