Pagini recente » Cod sursa (job #214232) | Cod sursa (job #2357233) | Cod sursa (job #1225326) | Cod sursa (job #2674529) | Cod sursa (job #1234650)
#include<stdio.h>
#include<vector>
using namespace std;
#define LL unsigned long long
#define UINT unsigned int
const int NMAX = (1<<20) + 5, MOD = 666013;
int n, distinct;
UINT x[NMAX];
vector < pair <LL, int> > h[MOD];
vector < pair <LL, int> >::iterator it;
void del (int val) {
int ln = val % MOD;
for(it = h[ln].begin(); it != h[ln].end(); ++ it)
if(it->first == val) {
-- it->second;
if(it->second == 0)
-- distinct;
}
}
void ins (int val) {
int ln = val % MOD, found = 0;
for(it = h[ln].begin(); it != h[ln].end(); ++ it)
if(it->first == val) {
++ it->second;
if(it->second == 1)
++ distinct;
found = 1;
}
if(!found) {
h[ln].push_back(make_pair(val, 1));
++ distinct;
}
}
int cnt (int lim) {
int i, left, right, ans;
for(i = 0; i < MOD; ++ i)
h[i].clear();
left = 0;
right = 0;
ans = distinct = 0;
while(left <= n && right <= n) {
while(distinct <= lim && right < n) {
ins(x[right + 1]);
++ right;
// fprintf(stderr, "left = %d, right = %d, distinct = %d\n", left, right, distinct);
}
if(right == n && distinct <= lim)
ans += right - left + 1;
//fprintf(stderr, "%d %d\n", left, right);
else
ans += right - left;
// fprintf(stderr, "%d %d\n", left, right - 1);
del(x[left + 1]);
++ left;
}
// fprintf(stderr, "%d\n\n", ans);
return ans;
}
int main() {
freopen("secv5.in", "r", stdin);
freopen("secv5.out", "w", stdout);
int l, u, i;
scanf("%d%d%d", &n, &l, &u);
for(i = 1; i <= n; ++ i)
scanf("%u", &x[i]);
printf("%d\n", cnt(u) - cnt(l - 1));
return 0;
}