Pagini recente » Cod sursa (job #2899084) | Cod sursa (job #4585) | Cod sursa (job #2517991) | Cod sursa (job #1582536) | Cod sursa (job #2877072)
#include <fstream>
#include <vector>
#include <map>
using namespace std;
ifstream fin("secv5.in");
ofstream fout("secv5.out");
vector <unsigned int> v;
map <unsigned int, unsigned int> fvst, fvdr;
int main() {
unsigned int N, L, U;
fin >> N >> L >> U;
for(unsigned int i = 1; i <= N; i++) {
unsigned int x; fin >> x; v.push_back(x);
}
unsigned int poz = 0, st = 0, dr = 0;
while(fvst.size() < L && poz < N) {
fvst[v[poz]]++;
fvdr[v[poz]]++;
poz++;
}
if(poz == N) {
if(fvst.size() < L) {
fout << 0 << '\n';
return 0;
}
}
st = poz - 1;
while(fvdr.size() <= U && poz < N) {
fvdr[v[poz++]]++;
}
if(fvdr.size() <= U)
dr = poz - 1;
else {
dr = poz - 2;
fvdr[v[poz - 1]]--;
if(fvdr[v[poz - 1]] == 0) {
fvdr.erase(v[poz - 1]);
}
}
long long ans = dr - st + 1;
poz = 1;
while(poz < N) {
fvst[v[poz - 1]]--;
fvdr[v[poz - 1]]--;
if(fvst[v[poz - 1]] == 0) {
fvst.erase(v[poz - 1]);
}
if(fvdr[v[poz - 1]] == 0) {
fvdr.erase(v[poz - 1]);
}
while(fvst.size() < L && st < N - 1) {
fvst[v[++st]]++;
}
if(st == N - 1 && fvst.size() < L)
break;
while(fvdr.size() <= U && dr < N - 1) {
fvdr[v[++dr]]++;
}
if(fvdr.size() > U)
dr--;
ans += dr - st + 1;
poz++;
}
fout << ans;
return 0;
}