Cod sursa(job #208984)

Utilizator andrei-alphaAndrei-Bogdan Antonescu andrei-alpha Data 19 septembrie 2008 21:36:10
Problema Secventa 5 Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.01 kb
using namespace std;

#include <map>
#include <set>
#include <list>
#include <deque>
#include <stack>
#include <queue>
#include <cmath>
#include <cstdio>
#include <vector>
#include <string>
#include <cstdlib>
#include <utility>
#include <algorithm>
#include <functional>

#define sz size
#define f first
#define s second
#define rz resize
#define db double
#define II inline
#define pb push_back
#define mp make_pair
#define ll long long
#define SCORE 100 :)
#define C(v) C.erase( all(v) )
#define all(v) v.begin() , v.end()
#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define FORit(it,v) for(it = (v).begin();it != (v).end();++it)

#define N_MAX 1<<19
#define L_MAX 1<<25
#define IN  "secv5.in"
#define OUT "secv5.out"
#define MOD 500009
 ///1006721
//#define R 84017 

char buffer[L_MAX];
int Step,V1[N_MAX],V2[N_MAX],P[N_MAX];
unsigned int M[N_MAX];
int K(-1),N,L,U;
vector< vector< int > > A(N_MAX);
vector< vector< int > > B(N_MAX);

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<<25,stdin);
	N = read();
	L = read();
	U = read();
	FOR(i,1,N)
		M[i] = read();	
}

II void hash()
{
	int cat,rest;
	bool ok;
	
	FOR(i,1,N)
	{
		ok = false;
		rest = M[i] % MOD;
		cat = M[i] / MOD;
		for(unsigned int i=0;i < A[rest].sz() && !ok;++i)
			if(A[rest][i] == cat)
				ok = true;
		if(!ok)
			A[rest].pb(cat);
	}
	
	cat = 0;
	FOR(i,0,N_MAX-1)
		for(unsigned int j=0;j<A[i].sz();++j)
			B[i].pb(++cat);	
	
	FOR(i,1,N)
	{
		rest = M[i] % MOD;
		cat = M[i] / MOD;
		
		for(unsigned int j=0;j<A[rest].sz();++j)
			if(A[rest][j] == cat)
			{
				M[i] = B[rest][j];
				break;
			}
	}
	
//	FOR(i,0,N_MAX-1)
//		vector<int> ().swap(B[i]),
//		vector<int> ().swap(A[i]);
	
}

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

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


/*

II long long solve(int  A)
{
	int X(0),x(1),y(0);
	
	memset(V1,0,sizeof(V1));
	memset(V2,0,sizeof(V2));
		
	for(int i = 1;i<=N;++i)
	{
		++y;
		if(! (V2[ (int)M[i] ] - V1[ (int)M[i] ]) )
			++X;
		++V2[ (int)M[i] ];
		
		for(;X <= A;)
		{
			if( !(V2[ (int)M[i+1] ] - V1[ (int)M[i+1] ]) && X == A)

}
*/