Pagini recente » Cod sursa (job #2050367) | Cod sursa (job #317848) | Cod sursa (job #1963260) | Cod sursa (job #1260654) | Cod sursa (job #1014456)
#include<fstream>
#include<algorithm>
using namespace std;
#define max_n 1100000
ifstream f("secv5.in");
ofstream g("secv5.out");
unsigned int n , l , u;
unsigned int S[max_n] , Fr1[max_n] , Fr2[max_n];
unsigned int sol , nr2 , nr1 , p1 , p2;
struct sp{
int nr , i;
}V[max_n];
bool cmp( sp x1 , sp x2 ){
return x1.nr < x2.nr;
}
void read(){
f>>n>>l>>u;
for( unsigned int i = 1 ; i <= n ; i++ ){
f>>V[i].nr; V[i].i = i;
}
sort(V+1 , V+n+1 , cmp);
for( unsigned int nr = 1 , i = 1 ; i <= n ; i++ )
S[V[i].i] = i>1 && V[i].nr == V[i-1].nr ? S[V[i-1].i] : (nr++);
}
int main(){
read();
p1 = 0; p2 = 0;
while( nr1 < l && p1 < n ){
p1++; Fr1[S[p1]]++;
if( Fr1[S[p1]] == 1 )
nr1++ ;
}
while( nr2 <= u && p2 < n ){
p2++; Fr2[S[p2]]++;
if( Fr2[S[p2]] == 1 )
nr2++;
}
if( nr2 > u ){
nr2--; Fr2[S[p2]]--; p2--;
}
if( nr1 >= l && nr2 <= u )
sol = p2 - p1 + 1;
for( unsigned int i = 2 ; i <= n ; i++ ){
Fr1[S[i-1]]--;
Fr2[S[i-1]]--;
if( Fr1[S[i-1]] == 0 )
nr1--;
if( Fr2[S[i-1]] == 0 )
nr2--;
while( nr1 < l && p1 < n ){
p1++; Fr1[S[p1]]++;
if( Fr1[S[p1]] == 1 )
nr1++;
}
while( nr2 <= u && p2 < n){
p2++; Fr2[S[p2]]++;
if( Fr2[S[p2]] == 1 )
nr2++;
}
if( nr2 > u ){
nr2--; Fr2[S[p2]]--; p2--;
}
if( nr1 >= l && nr2 <= u )
sol += p2 - p1 + 1;
}
g<<sol<<"\n";
return 0;
}