Pagini recente » Cod sursa (job #1642400) | Cod sursa (job #2515386) | Cod sursa (job #2330584) | Cod sursa (job #2938053) | Cod sursa (job #1047969)
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
#define uint unsigned int
#define ll unsigned long long
#define MAX_N 1 << 20
ifstream fin( "secv5.in" );
ofstream fout( "secv5.out" );
pair < uint, int > v[MAX_N];
pair < int, int > a[MAX_N];
int freq[MAX_N];
bool cmp( pair< int, int > x, pair< int, int > y ) {
return x.second < y.second;
}
void read( int &n, int &l, int &u ) {
fin >> n >> l >> u;
for ( int i = 0; i < n; ++i ) {
fin >> v[i].first;
v[i].second = i;
}
}
void simplify( int n ) {
sort( v, v + n );
a[0].first = 1;
a[0].second = v[0].second;
for ( int i = 1; i < n; ++i ) {
a[i].first = a[i - 1].first;
a[i].second = v[i].second;
if ( v[i].first != v[i - 1].first )
++a[i].first;
}
sort( a, a + n, cmp );
}
void init( int n ) {
for ( int i = 0; i <= n; ++i )
freq[i] = 0;
}
ll solve( int limit, int n ) {
if ( limit == 0 )
return 0;
init( n );
ll ans = 0;
int left = 0, distinct_numbers = 0;
for ( int i = 0; i < n; ++i ) {
if ( !freq[a[i].first] )
while ( left <= i && distinct_numbers == limit ) {
--freq[a[left].first];
if ( freq[a[left].first] == 0 )
--distinct_numbers;
++left;
}
if ( !freq[a[i].first] )
++distinct_numbers;
++freq[a[i].first];
ans += ( ll ) i - left + 1;
}
return ans;
}
int main() {
int n, l, u;
read( n, l, u );
simplify( n );
ll ans = solve( u, n ) - solve( l - 1, n );
fout << ans;
}