Pagini recente » Cod sursa (job #2714000) | Cod sursa (job #1365132) | Cod sursa (job #1857859) | Cod sursa (job #539553) | Cod sursa (job #3142216)
#include <fstream>
#include <unordered_map>
using namespace std;
const int Nmax = (1 << 20) + 1;
int a[Nmax], L, U, n;
unordered_map<int, int> fr1, fr2;
int main() {
ifstream fin("secv5.in");
ofstream fout("secv5.out");
fin >> n >> L >> U;
for(int i = 1; i <= n; i++) {
fin >> a[i];
}
// Secventa a[i1...j] trb sa aibe maxim U valori distincte
// Secventa a[i2...j] trb sa aibe minim L valori distincte
int i1 = 1, i2 = 1, cnt1 = 0, cnt2 = 0;
long long sol = 0;
for(int j = 1; j <= n; j++) {
// Adaugam a[j] la fr1
fr1[a[j]]++;
if(fr1[a[j]] == 1) {
cnt1++;
}
// Adaugam a[j] la fr2
fr2[a[j]]++;
if(fr2[a[j]] == 1) {
cnt2++;
}
while(cnt1 > U) {
// Scot a[i1] din fr1
fr1[a[i1]]--;
if(fr1[a[i1]] == 0) {
cnt1--;
}
i1++;
}
while(cnt2 >= L) {
// Scot a[i2] din fr2
fr2[a[i2]]--;
if(fr2[a[i2]] == 0) {
cnt2--;
}
i2++;
}
i2--;
fr2[a[i2]]++;
if(fr2[a[i2]] == 1) {
cnt2++;
}
sol += i2 - i1 + 1;
}
fout << sol << "\n";
return 0;
}