Cod sursa(job #210617)

Utilizator 0000go gcc 0000 Data 28 septembrie 2008 12:21:27
Problema Secventa 5 Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 kb
using namespace std;

#include <cstdio>
#include <vector>

#define II inline
#define ll long long
#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define N_MAX (1<<20)+2
#define L_MAX 1<<24
#define IN  "secv5.in"
#define OUT "secv5.out"
#define MOD  666013

char buffer[L_MAX];
unsigned int V1[666022],V2[666022];
unsigned int M[N_MAX],P[N_MAX];
int K(-1),N,L,U;

II unsigned int read()
{
	unsigned int aux(0);
	for(;buffer[K] > '9' || buffer[K] < '0';++K);
	for(;buffer[K] <= '9' && buffer[K] >= '0';++K)
		aux = aux * 10 + buffer[K] - '0';
	return aux;
}

II void scan()
{
	freopen(IN, "r",stdin);
	freopen(OUT, "w",stdout);
	fread(buffer,1,1<<24,stdin);
	fclose(stdin);
	N = read();
	L = read();
	U = read();
	FOR(i,1,N)
		M[i] = read();
}		

II void hash()
{
	unsigned j,rest;
	FOR(i,1,N)
	{
		rest = M[i] % MOD;
		for(j=rest;P[j] != M[i] && P[j];++j);
		P[j] = M[i];
		M[i] = j;
	}	
}

II long long solve(int  A)
{
	int X(0),x(1);
	if(P[N])
	memset(V1,0,sizeof(V1)),
	memset(V2,0,sizeof(V2));
	
	FOR(i,1,N)
	{
		if(! (V2[ M[i] ] - V1[ M[i] ]) )
			++X;
		++V2[ M[i] ];
		
		for(;X <= A && i<=N;)
		{
			if( !(V2[ M[i+1] ] - V1[ M[i+1] ]) && X == A)
				break;
			P[i] = x;
			++i;
			if(! (V2[ M[i] ] - V1[ M[i] ]) )
				++X;
			++V2[ M[i] ];
		}	
		
		if(X > A+1)
			exit(-1);
		for(;X > A && x<=N;)
		{
			if( !(V2[ M[x] ] - V1[ M[x] ] - 1) )
				--X;
			++V1[ M[x] ];
			++x;	
		}
		if(X > A)
			exit(-1);
		P[i] = x;
	}
	
	long long rez(0);
	FOR(i,1,N)
		rez += (long long) (i-P[i]+1);
	if(rez < 0)
		rez = 0;
	return rez;	
}

int main()
{
	scan();
	hash();
	printf("%lld\n", solve(U) - solve(L-1) );
	return 0;
}