Pagini recente » Cod sursa (job #396983) | Cod sursa (job #451668) | Cod sursa (job #2626440) | Cod sursa (job #2655461) | Cod sursa (job #12941)
Cod sursa(job #12941)
#include <cstdio>
#include <memory>
using namespace std;
const char iname[] = "secv5.in";
const char oname[] = "secv5.out";
#define MAX_N 1048576
#define MAX_BUF 11000000
#define MAX_V 65536
typedef unsigned int u32;
int N, L, U;
u32 X[MAX_N];
u32 A[MAX_N], B[MAX_N];
int P[MAX_N];
int cnt[MAX_V], cntL[MAX_N], cntU[MAX_N], _index[MAX_N];
char buffer[MAX_BUF];
void read_in(void)
{
freopen(iname, "r", stdin);
int i;
int len;
u32 num;
char *p, *lim;
scanf("%d %d %d\n", &N, &L, &U);
len = int(fread(buffer, sizeof(char), MAX_BUF, stdin));
p = buffer;
lim = buffer + len;
for (i = 0; i < N; ++i) {
num = 0;
for (; (p < lim) && (*p) < '0'; ++p) ;
for (; (p < lim) && (*p) >= '0'; ++p)
num = num * 10 + (u32)((*p) - '0');
X[i] = num;
}
}
void sort(u32 A[], u32 B[], const int k)
{
int i;
memset(cnt, 0, sizeof(cnt));
for (i = 0; i < N; ++i) {
_index[i] = ((X[ A[i] ] >> (k * 16)) & 65535);
cnt[_index[i]] ++;
}
for (i = 1; i < MAX_V; ++i)
cnt[i] += cnt[i - 1];
for (i = N; i--; )
B[-- cnt[_index[i]]] = A[i];
}
int main(void)
{
read_in();
int i;
int k;
int FL, numL = 0;
int FU, numU = 0;
long long Res = 0;
for (i = 0; i < N; ++i)
A[i] = i;
sort(A, B, 0);
sort(B, A, 1);
for (i = 0; i < N; ++i) {
if ((i > 0) && (X[ A[i] ] == X[ A[i - 1] ]))
P[ A[i] ] = P[ A[i - 1] ];
else
P[ A[i] ] = A[i] ;
}
for (i = FU = FL = 0; i < N; ++i) {
k = P[i];
numL += ((++ cntL[k]) == 1);
numU += ((++ cntU[k]) == 1);
for (; numU > U; ++FU) {
k = P[FU];
numU -= ((-- cntU[k]) == 0);
}
for (; numL >= L; ++FL) {
k = P[FL];
if ((cntL[k] == 1) && (numL == L))
break ;
numL -= ((-- cntL[k]) == 0);
}
if (L == numL)
Res += (long long)(FL - FU + 1);
}
freopen(oname, "w", stdout);
printf("%lld\n", Res);
return 0;
}