Pagini recente » Cod sursa (job #1077129) | Cod sursa (job #538083) | Cod sursa (job #1065406) | Cod sursa (job #2274186) | Cod sursa (job #959935)
Cod sursa(job #959935)
#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++]]++;
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;
}