Cod sursa(job #327416)

Utilizator Mishu91Andrei Misarca Mishu91 Data 28 iunie 2009 20:01:36
Problema Secventa 5 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <cstdio>
#include <fstream>
#include <vector>

using namespace std;

#define MAX_N 1100000
#define MOD 666013

unsigned int N, L, U, K;
unsigned int V[MAX_N], T[MAX_N], A[MAX_N];
long long Sol;
vector <unsigned int> H[MOD];

ifstream fin ("secv5.in");
ofstream fout ("secv5.out");

void citire()
{
	fin >> N >> L >> U;
	
	for(unsigned int i = 1; i <= N; ++i)
		fin >> V[i];
}

void insert(unsigned int i)
{
	int k = V[i] % MOD;
	
	H[k].push_back(i);
}

unsigned int find(unsigned int x)
{
	int k = x % MOD;
	
	for(vector <unsigned int> ::iterator it = H[k].begin(); it != H[k].end(); ++it)
		if(V[*it] == x)
			return *it;
		
	return 0;
}

void norm()
{
	for(unsigned int i = 1; i <= N; ++i)
	{
		A[i] = A[find(V[i])];
		if(A[i]) continue;
		
		A[i] = ++K;
		insert(i);
	}
}

long long solve(unsigned int k)
{
	memset(T, 0, sizeof T);
	unsigned int nr = 0, li = 1, lf = 1;
	long long sol = 0;
	
	for( ;lf <= N; ++lf)
	{
		++T[A[lf]];
		if(T[A[lf]] == 1) ++nr;
		
		while(1)
		{
			if(nr <= k) break;
			
			--T[A[li]];
			if(T[A[li]] == 0) --nr;
			++li;
		}
		
		sol += (lf - li + 1);
	}
	
	return sol;
}

int main()
{
	citire();
	norm();
	Sol = solve(U) - solve(L-1);
	fout << Sol;
}