Pagini recente » Cod sursa (job #841284) | Cod sursa (job #515748) | Cod sursa (job #1791284) | Cod sursa (job #223352) | Cod sursa (job #959939)
Cod sursa(job #959939)
#include <fstream>
#include <vector>
using namespace std;
#define key 666013
#define h(x) ((x)%key)
#define in "secv5.in"
#define out "secv5.out"
#define xx first
#define yy second
#define N ((1 << 20) + 5)
typedef unsigned u;
typedef pair <u, u> elem;
typedef vector <elem> :: iterator IT;
vector <elem> list[key];
u norm[N], c[2][N], L, U, n;
IT search(elem x) {
for (IT it = list[h(x.xx)].begin(); it != list[h(x.xx)].end(); ++it)
if (it -> xx == x.xx)
return it;
return list[h(x.xx)].end();
}
int main () {
ifstream fin (in);
fin >> n >> L >> U;
for (u i = 0; i < n; ++i) {
int x;
fin >> x;
IT it = search(elem(x, i));
if (it != list[h(x)].end())
norm[i] = it -> yy;
else {
list[h(x)].push_back(elem(x, i));
norm[i] = i;
}
}
u ll, uu, dl, du;
uu = ll = dl = du = 0;
u long long sol = 0;
for (u i = 0; i < n; ++i) {
while (ll < n && dl < L)
dl += ((c[0][norm[ll++]]++) == 0);
while (uu < n && du + !c[1][norm[uu]] <= U)
du += ((c[1][norm[uu++]]++) == 0);
if (dl >= L)
sol += (uu - ll + 1);
dl -= ((--c[0][norm[i]]) == 0);
du -= ((--c[1][norm[i]]) == 0);
}
ofstream fout (out);
fout << sol;
fout.close();
return 0;
}