Pagini recente » Cod sursa (job #2974469) | Cod sursa (job #2069299) | Cod sursa (job #491409) | Cod sursa (job #1990309) | Cod sursa (job #1146107)
#include <algorithm>
#include <fstream>
using namespace std;
ifstream in("secv5.in");
ofstream out("secv5.out");
const int NMAX= (1<<20);
struct POZ {
unsigned int val,poz;
};
bool comp( POZ a, POZ b ) {
if( a.val == b.val ) return a.poz < b.poz;
return a.val < b.val;
}
unsigned int a[NMAX+1], f[NMAX+1];
POZ v[NMAX+1];
int N, L, U;
void Norm() {
sort( v+1, v+N+1, comp );
for( int i= 1; i<=N; i++ ) {
a[ v[i].poz ]= a[ v[i-1].poz ] + !( v[i].val==v[i-1].val );
}
}
long long Gogu( int p ) {
long long sol= 0LL;
for( int i= 0; i<NMAX; i++ ) {
f[i]= 0;
}
int st= 1, dr= 0, cn= 0;
while( dr <= N && cn <= p ) {
++dr;
if( ++f[ a[dr] ] == 1 ) {
++cn;
}
}
sol+= dr-st;
if( --f[ a[st] ] == 0 ) --cn;
++st;
while( dr <= N ) {
while( cn > p ) {
sol+= dr-st;
if( --f[ a[st] ] == 0 ) --cn;
++st;
}
while( dr <= N && cn <= p ) {
++dr;
if( ++f[ a[dr] ] == 1 ) cn++;
}
}
while( st <= N ) {
sol+= dr-st;
++st;
}
return sol;
}
void citeste() {
in >> N >> L >> U;
for( int i= 1; i<=N; i++ ) {
in >> a[i];
v[i].val= a[i];
v[i].poz= i;
}
}
int main() {
citeste();
Norm();
out << Gogu( U ) - Gogu( L-1 ) << '\n';
}