Pagini recente » Cod sursa (job #1161275) | Cod sursa (job #1137002) | Cod sursa (job #2294125) | Cod sursa (job #2832755) | Cod sursa (job #2909649)
#include <fstream>
#define int long long
using namespace std;
const int MAX_N = 1 << 20;
const int M = 666019;
unsigned int a[MAX_N + 1];
unsigned int val[MAX_N + 1], fr[MAX_N + 1], urm[MAX_N + 1], lst[M], nr;
unsigned int n, l, u;
unsigned int exista(unsigned int x) {
unsigned int c = x % M;
unsigned int p = lst[c];
while (p != 0) {
if (x == val[p]) {
return p;
}
p = urm[p];
}
return 0;
}
unsigned int adauga(unsigned int x) {
unsigned int p = exista(x);
if (p != 0) {
fr[p]++;
return p;
}
unsigned int c = x % M;
val[++nr] = x;
fr[nr] = 1;
urm[nr] = lst[c];
lst[c] = nr;
return nr;
}
unsigned int sterge(unsigned int x) {
unsigned int p = exista(x);
fr[p]--;
return p;
}
long long Count(int k) {
for (int i = 1; i <= n; i++) {
fr[i] = 0;
}
for (int i = 0; i < M; i++) {
lst[i] = 0;
}
nr = 0;
int j = 1, cnt = 0;
long long answer = 0;
for (int i = 1; i <= n; i++) {
int index = adauga(a[i]);
if (fr[index] == 1) {
cnt++;
}
while (j <= i && cnt > k) {
int index = sterge(a[j]);
if (fr[index] == 0) {
cnt--;
}
j++;
}
answer += i - j + 1;
}
return answer;
}
signed main() {
ifstream fin("secv5.in");
ofstream fout("secv5.out");
fin >> n >> l >> u;
for (int i = 1; i <= n; i++) {
fin >> a[i];
}
fout << Count(u) - Count(l - 1);
return 0;
}