Pagini recente » Cod sursa (job #612818) | Cod sursa (job #1067619)
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <vector>
#include <list>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <algorithm>
#define INFL "secv5.in"
#define OUTFL "secv5.out"
using namespace std;
#define MOD 666013
int n, l, u;
unsigned v[(1<<20)+1];
map<unsigned, int> H;
map<unsigned, int>::iterator it;
list< pair<unsigned, unsigned> > _hash[MOD];
list< pair<unsigned, unsigned> >::iterator it2;
void clear_hash() {
for(int i=0; i<MOD; ++i) _hash[i].clear();
}
unsigned h(unsigned x) { return x%MOD; }
bool find(unsigned x) {
int y = h(x);
for(it2 = _hash[y].begin(); it2!=_hash[y].end(); ++it2)
if(it2->first == x) return true;
return false;
}
unsigned get(unsigned x) {
int y = h(x);
for(it2 = _hash[y].begin(); it2!=_hash[y].end(); ++it2)
if(it2->first == x) return it2->second;
return -1;
}
void insert(unsigned x, unsigned v) {
int y = h(x);
_hash[y].push_back(make_pair(x, v));
}
void erase(unsigned x) {
int y = h(x);
for(it2 = _hash[y].begin(); it2!=_hash[y].end(); ++it2)
if(it2->first == x) {
_hash[y].erase(it2);
return;
}
}
void read() {
scanf("%d%d%d", &n, &l, &u);
int x = 0;
unsigned val;
for(int i=1; i<=n; ++i) {
scanf("%u", &v[i]);
val = get(v[i]);
if(val == -1) {
++x;
insert(v[i], x);
v[i] = x;
//printf("%d\n", v[i]);
}
else {
v[i] = val;
//printf("%d\n", v[i]);
}
}
clear_hash();
}
unsigned f(int x) { //nr secv cu cel mult x elem dist
if(!x) return 0;
unsigned ans = 0;
int nr = 0, st = 1;
unsigned val;
for(int i=1; i<=n; ++i) {
val = get(v[i]);
if(val == -1) {
insert(v[i], 1);
++nr;
}
else {
++val;
erase(v[i]);
insert(v[i], val);
}
while( nr > x ) {
val = get(v[st]);
erase(v[st]);
--val;
if(!val) --nr;
else insert(v[st], val);
++st;
}
//printf("%d %d %d\n", st, i, nr);
ans += (unsigned)(i-st+1);
}
clear_hash();
return ans;
}
void solve() {
/*for (int i = 0; i < n; ++i)
{
printf("%d ", v[i+1]);
} printf("\n");*/
printf("%u", f(u) - f(l-1));
}
int main() {
//#define ONLINE_JUDGE 1
#ifndef ONLINE_JUDGE
freopen(INFL, "r", stdin);
freopen(OUTFL, "w", stdout);
#endif
read();
solve();
return 0;
}