Pagini recente » Cod sursa (job #2552743) | Cod sursa (job #308853) | Cod sursa (job #2024211) | Cod sursa (job #330874) | Cod sursa (job #667614)
Cod sursa(job #667614)
#include <cstdio>
#include <cstring>
#include <vector>
#include <utility>
using namespace std;
#define MAXN ((1<<20)+10)
#define MOD 6007
vector< pair<unsigned,int> > H[MOD];
int N, F[MAXN], A[MAXN];
inline void hash_add(unsigned x, int a){
int key;
key=x%MOD;
H[key].push_back(make_pair(x, a));
}
inline int hash_find(unsigned x){
int key;
vector< pair<unsigned,int> >::iterator ii;
key=x%MOD;
for(ii=H[key].begin(); ii!=H[key].end(); ii++)
if(ii->first == x)
return ii->second;
return -1;
}
inline long long subsequence_up_to(int v){
memset(F, 0, sizeof(F));
int cnt, l, i;
long long res;
cnt=0; res=0; l=0;
for(i=0; i<N; i++){
if(!F[A[i]])
cnt++;
F[A[i]]++;
while(cnt > v){
--F[A[l]];
if(!F[A[l]])
cnt--;
l++;
}
res+=i-l+1;
}
return res;
}
int main(){
freopen("secv5.in", "r", stdin);
freopen("secv5.out", "w", stdout);
int L, R, cnt, i;
unsigned aux;
cnt=0;
scanf("%d%d%d", &N, &L, &R);
for(i=0; i<N; i++){
scanf("%u", &aux);
if((A[i]=hash_find(aux)) == -1){
A[i]=++cnt;
hash_add(aux, cnt);
}
}
printf("%lld\n", subsequence_up_to(R)-subsequence_up_to(L-1));
return 0;
}