Pagini recente » Cod sursa (job #329628) | Cod sursa (job #2331548) | Cod sursa (job #2684176) | Cod sursa (job #2831319) | Cod sursa (job #1819656)
#include <cstdio>
#include <algorithm>
const int MAX_N = 1 << 20;
unsigned int v[MAX_N];
unsigned int* p[MAX_N];
int f[MAX_N];
bool cmp(unsigned int *a, unsigned int *b) {return *a < *b;}
void normalize(int n) {
unsigned int j, last;
for(int i = 0; i < n; ++i)
p[i] = &v[i];
std::sort(p, p + n, cmp);
j = 0;
last = *p[0];
for(int i = 0; i < n; ++i) {
if(*p[i] == last)
*p[i] = j;
else {
last = *p[i];
*p[i] = ++j;
}
}
}
int solveWindow(int n, int s) {
int sized, st, dr, rez;
st = 0;
dr = -1;
sized = 0;
rez = 0;
for(int i = 0; i < n; ++i)
f[i] = 0;
while(dr < n) {
while(dr < n && sized <= s) {
dr++;
if(dr < n) {
if(f[v[dr]] == 0)
sized++;
f[v[dr]]++;
if(sized <= s) {
rez = rez + dr - st + 1;
}
}
}
while(st < n && sized > s) {
if(st < n) {
if(f[v[st]] == 1)
sized--;
f[v[st]]--;
}
++st;
}
if(st < n && dr < n && st <= dr) {
rez = rez + dr - st + 1;
}
}
return rez;
}
int main() {
int n, l, u;
FILE *fin = fopen("secv5.in", "r");
fscanf(fin, "%d%d%d", &n, &l, &u);
for(int i = 0; i < n; ++i) {
fscanf(fin, "%u", &v[i]);
}
fclose(fin);
normalize(n);
FILE *fout = fopen("secv5.out", "w");
fprintf(fout, "%d", solveWindow(n, u) - solveWindow(n, l - 1));
fclose(fout);
return 0;
}