Pagini recente » Cod sursa (job #1291336) | Rating Teodor Morosan (epicteodor) | Cod sursa (job #105556) | Rating Florea Vasile Alexandru (TheAlex1) | Cod sursa (job #959946)
Cod sursa(job #959946)
#include <fstream>
#include <vector>
using namespace std;
#define key 666013
#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;
u h(u x) {
return ((x < key) ? x : x % key);
}
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++]]++;
while (uu < n && du + !c[1][norm[uu]] <= U)
du += !c[1][norm[uu++]]++;
if (dl >= L)
sol += (uu - ll + 1);
dl -= !--c[0][norm[i]];
du -= !--c[1][norm[i]];
}
ofstream fout (out);
fout << sol;
fout.close();
return 0;
}