Cod sursa(job #432347)

Utilizator tamas_iuliaTamas Iulia tamas_iulia Data 2 aprilie 2010 11:27:09
Problema Secventa 5 Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.85 kb
#include <stdio.h>
#include <vector>
#define Nmax 1048600
#define pb push_back
#define mp make_pair
#define x first
#define nr second
#define UL unsigned long
#define Mod 666013UL
using namespace std;

vector< pair<UL,UL> > G[Mod];
vector< UL > H[Mod];

UL v[Nmax];
UL n,P,U,i; // unsigned long?
UL x,nr,last_nr,ok;
UL sumaU,sumaP;

inline int Find(UL x){
	int list=x%Mod;
	vector< pair<UL,UL> >:: iterator it;
	
	for(it=G[list].begin(); it!=G[list].end(); ++it)
		if(it->x == x){
			last_nr=it->nr;
			return 1;
		}
	return -1;
}

inline vector< UL >::iterator find(UL x){
	UL list=x%Mod;
	vector< UL >:: iterator it;
	for(it=H[list].begin(); it!=H[list].end(); ++it)
		if(*it==x) return it;
	return H[list].end();
}

inline void add(UL x){
	H[x%Mod].pb(x);
}
inline void sterg(UL x){
	H[x%Mod].erase(find(x));
	if(find(x)==H[x%Mod].end()) ok=1; // am sters tot dintr un elem
}

void work(UL U, UL& sumaU){
	UL i,Lu=1,Lastu=1,nr=0;
	
	for(i=1;i<=n;++i){
		if( find(v[i]) == H[v[i]%Mod].end() ){
			add(v[i]); nr++;
			
			if( nr > U ){
				Lu=Lastu;
				ok=0; // tre sa sterg pana cand ajung sa se stearga de tot unul dintre nr
				sterg(v[Lu]); // sterg 
				for(Lu++; !ok ; ){ 
					sterg(v[Lu]);
					Lu++;
				}
				nr--;
			}
			
			sumaU+= i-Lu+1;
			Lastu=Lu;
		}
		else{ // era deja 
			add(v[i]);
			sumaU+= i-Lastu+1;
		}
	}
	//for(i=Lu; i<=n; ++i) H[v[i]%Mod].clear();
	for(i=0;i<Mod;++i) H[i].clear();

}	


int main(){
	freopen("secv5.in","r",stdin);
	freopen("secv5.out","w",stdout);
	scanf("%lu%lu%lu",&n,&P,&U);
	
	for(i=1;i<=n;++i){
		scanf("%lu",&x);
		
		if(Find(x) == -1){
			G[x%Mod].pb(mp(x,++nr));
			v[i]=nr;
		}
		else v[i]=last_nr;
		
	}
	
	sumaU=sumaP=0;
	work(U,sumaU);
	work(P-1,sumaP);
	
	printf("%lu\n",sumaU-sumaP);
	fclose(stdin); fclose(stdout);
	return 0;
}