Pagini recente » Cod sursa (job #2499259) | Cod sursa (job #161981) | Cod sursa (job #1638110) | Cod sursa (job #1072949) | Cod sursa (job #265571)
Cod sursa(job #265571)
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;
typedef unsigned int I;
int n;
struct nod {
I val;
int id;
nod* nextP;
};
typedef nod* nodP;
int idx = 0;
nodP Hash[1000000];
const int M = 999983;
int v[1 << 20];
int diva[(1<<20)+1];
int A, B, N;
int findIdx(I X) {
int key = X % M;
nodP index = Hash[key];
while (index != NULL) {
if (index->val == X) return index->id;
index = index->nextP;
}
return -1;
}
void addHash(I X) {
int key = X % M;
nodP bb = new nod;
bb->val = X; bb->id = idx;
bb->nextP = Hash[key];
Hash[key] = bb;
++idx;
}
typedef long long LL;
LL findA(I A) {
//sub lungime A
if (A == 0) return 0;
int distincte = 0;
int left = 0;
LL total = 0;
for (int i = 0; i < N; ++i) {
if (!diva[v[i]]) {++distincte;}
++diva[v[i]];
//adjust left
while (left < i && distincte > A) {
if (--diva[v[left++]] == 0) --distincte;
}
total+= i - left + 1;
}
while (left < N) {--diva[v[left++]];}
return total;
}
int main() {
ifstream fin("secv5.in");
ofstream fout("secv5.out");
fin >> N >> A >> B;
for (int i = 0; i < N; ++i) {
I X;
fin >> X;
v[i] = findIdx(X);
if (v[i] == -1) { v[i] = idx; addHash(X); }
}
fout << findA(B) - findA(A-1) << '\n';
return 0;
}