Cod sursa(job #1014456)

Utilizator roots4Irimia Alexandru Gabriel roots4 Data 22 octombrie 2013 18:51:53
Problema Secventa 5 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.47 kb
#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;
}