Pagini recente » Cod sursa (job #1231868) | Cod sursa (job #1192122) | Cod sursa (job #2588665) | Cod sursa (job #282161) | Cod sursa (job #1061482)
#include <fstream>
#include <cstring>
#include <list>
#include <set>
using namespace std;
typedef pair<unsigned, unsigned> pere;
typedef list<pere> Hash;
typedef Hash::iterator hit;
const int NMAX = (1 << 20) + 1, MOD = 666013;
Hash h[MOD];
int N, L, U, used[NMAX];
unsigned unic[NMAX];
unsigned find(unsigned val) {
unsigned rez = 0, x = val % MOD;
for(hit i = h[x].begin(); i != h[x].end() && !rez; i++)
if (i->first == val)
rez = i->second;
return rez;
}
long long lung(unsigned x) {
if (x == 0) return 0LL;
unsigned nr = 0u;
long long sol = 0LL;
memset(used, 0, sizeof(used));
for(int start = 2, stop = 1; stop <= N; stop++) {
used[unic[stop]]++;
if (used[unic[stop]] == 1) nr++;
for(; nr > x; start++) {
used[unic[start-1]]--;
if (used[unic[start-1]] == 0) nr--;
}
sol += 2LL + stop - start;
}
return sol;
}
int main() {
ifstream f("secv5.in");
ofstream g("secv5.out");
unsigned k, nr = 1, x, poz;
f >> N >> L >> U;
for (int i = 1; i <= N; i++) {
f >> k;
x = k % MOD;
poz = find(k);
if (poz) unic[i] = poz;
else {
unic[i] = nr;
h[x].push_back(pere(k, nr++));
}
}
g << lung(U) - lung(L - 1);
f.close();
g.close();
return 0;
}