Pagini recente » Cod sursa (job #1110) | Cod sursa (job #580658) | Cod sursa (job #3265042) | Cod sursa (job #1807998) | Cod sursa (job #10788)
Cod sursa(job #10788)
using namespace std;
#include <cstdio>
#include <map>
#include <iostream>
#include <cstring>
#include <algorithm>
int N, L, U, cnt[ 1<<20 + 1 ];
unsigned int A[1<<20+2];
unsigned int B[1<<20+2], C[1<<20+2];
/*
bool cmp ( const int & x1, const int & x2 )
{
return A[x1] < A[x2];
}
void resort()
{
for( int i = 1; i <= N; i++ )
B[i] = i;
sort( B + 1, B + N + 1, cmp );
int j = 1, k, cnt = 1;
for( int i = 1; i <= N; i++ )
{
for( j = i; j <= N && A[ B[i] ] == A[ B[j] ]; j++ );
k = --j;
while( j >= i ) A[ B[j] ] = cnt, j--;
i = k;
++cnt;
}
}
*/
void my_resort()
{
memcpy( B, A, sizeof( A ) );
sort( B + 1, B + N + 1 );
int nr = 0, j;
for( int i = 1; i <= N; i++ )
{
for( j = i; j <= N && B[j] == B[i]; j++ );
--j;
C[++nr] = B[i];
i = j;
}
for( int i = 1; i <= N; i++ )
A[i] = lower_bound( C + 1, C + nr + 1, A[i] ) - A;
}
long long doit( int LEN )
{
long long ret = 0;
int r = 0, dist = 0;
bool can;
memset( cnt, 0, sizeof( cnt ) );
for( int i = 1; i <= N; i++ )
{
while( r + 1 <= N )
{
if( !(cnt[ A[r+1] ] || dist + 1 <= LEN ) )
break;
dist += !cnt[ A[r+1] ];
cnt[ A[r+1] ]++;
++r;
}
cnt[ A[i] ]--;
if( !cnt[A[i]] )
dist--;
ret += (long long)( r ) - i + 1;
}
return ret;
}
int main()
{
freopen("secv5.in", "r", stdin);
freopen("secv5.out", "w", stdout);
char buf[12];
char * p;
scanf("%d %d %d \n", &N, &L, &U);
for( int i = 1; i <= N; i++ )
{
gets( buf );
for( p = buf; *p != '\0'; p++ )
A[i] = A[i] * 10 + (*p) - '0';
// cout << A[i] << endl;
// scanf("%ud", A + i );
}
my_resort();
cout << doit( U ) - doit( L - 1 ) << endl;
return 0;
}