Pagini recente » Cod sursa (job #344730) | Cod sursa (job #1417865) | Cod sursa (job #1026763) | Cod sursa (job #1089408) | Cod sursa (job #12621)
Cod sursa(job #12621)
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <vector>
#define MOD 3191
#define NMax 1048580
using namespace std;
int N, L, U;
unsigned int v[NMax], a[NMax], h = 1;
int uz[NMax];
long long Res = 0;
int BS(int X)
{
int l, r, m;
l = 1; r = h;
while (l <= r)
{
m = (l + r) / 2;
if (X > a[m]) l = m+1;
else if (X < a[m]) r = m-1;
else return m;
}
return -1;
}
void check(int X, int semn)
{
int i, lst, nrd;
if (X == 0) return ;
memset(uz, 0, sizeof(uz));
for (i = 1, lst = 1, nrd = 0; i <= N; i++)
{
if (!uz[v[i]]) nrd++;
uz[v[i]]++;
while (lst < i && nrd > X)
{
uz[v[lst]]--;
if (!uz[v[lst]]) nrd--;
lst++;
}
Res += semn * (i-lst+1);
}
}
int main(void)
{
int i, j, l;
char buf[64];
freopen("secv5.in", "r", stdin);
freopen("secv5.out", "w", stdout);
scanf("%d %d %d\n", &N, &L, &U);
for (i = 1; i <= N; i++)
{
fgets(buf, sizeof(buf), stdin);
l = strlen(buf);
for (j = 0; j < l; j++)
if (buf[j] >= '0' && buf[j] <= '9')
v[i] = v[i] * 10 + (buf[j] - '0');
else break;
}
for (i = 1; i <= N; i++) a[i] = v[i];
sort(a+1, a+N+1);
for (i = 2; i <= N; i++)
if (a[i] != a[h])
a[++h] = a[i];
for (i = h + 1; i <= N; i++) a[i] = 0;
for (i = 1; i <= N; i++)
v[i] = BS(v[i]);
check(U, +1);
check(L-1, -1);
printf("%lld\n", Res);
return 0;
}