Cod sursa(job #432422)

Utilizator tamas_iuliaTamas Iulia tamas_iulia Data 2 aprilie 2010 12:42:43
Problema Secventa 5 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <stdio.h>
#include <string.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
#define LL long long
using namespace std;

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

int v[Nmax],H[Nmax];
int n,P,U,i,j; 
int nr,last_nr,ok;
LL sumaU,sumaP;
UL x;

char s[256];

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

void work(int U, LL& sumaU){
	int i,Lu=1, nr=0;
	
	for(i=1;i<=n;++i){
		if( H[v[i]] == 0 ){
			H[v[i]]++, nr++;
			
			if( nr > U ){
				ok=0; // tre sa sterg pana cand ajung sa se stearga de tot unul dintre nr
				for(; !ok ; Lu++ ){ 
					H[v[Lu]]--;
					if(H[v[Lu]]==0) ok=1;
				}
				nr--;
			}
		}
		else H[v[i]]++;
		
		sumaU=(LL) sumaU-Lu+i+1;
	}
	memset(H,0,sizeof(H));
}	


int main(){
	freopen("secv5.in","r",stdin);
	freopen("secv5.out","w",stdout);
	scanf("%d%d%d\n",&n,&P,&U);
	
	for(i=1;i<=n;++i){
		fgets(s,255,stdin); x=0;
		for(j=0; s[j]>='0' && s[j]<='9'; ++j)
			x=x*10+s[j]-'0';
		
		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("%lld\n",sumaU-sumaP);
	fclose(stdin); fclose(stdout);
	return 0;
}