Cod sursa(job #1459531)

Utilizator theprdvtheprdv theprdv Data 10 iulie 2015 06:57:26
Problema Secventa 5 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <cstring>
#define MAXN (1 << 20)
#define MOD 666013
#define list (x % MOD)

using namespace std;

unsigned int N, no, j, l, u, L[MAXN], used[MAXN], A[MAXN];
vector <pair <unsigned int, unsigned int>> G[MOD];

inline decltype(G[0].begin()) find_val(unsigned int x){
	decltype(G[0].begin()) it = G[list].begin();

	for (; it != G[list].end(); ++it)
		if (it->first == x) return it;
	return it;
}

inline unsigned int insert_val(unsigned int x){
	decltype(G[0].begin()) it;
	it = find_val(x);

	if (it == G[list].end()){
		G[list].push_back(make_pair(x, ++no));
		return no;
	}
	return it->second;
}

inline unsigned int compute(unsigned int c){
	memset(used, 0, N * sizeof (unsigned int));
	unsigned int now = 0, ans = 0;
	A[0]= j = 1;
	for (unsigned int i = 1; i <= N; ++i){
		if (used[L[i]] >= j || now < c) {
			if (used[L[i]] < j) ++now;
			used[L[i]] = i, A[i] = A[i - 1];
		}
		else {
			for (; used[L[j]] != j; ++j);
			A[i] = ++j;
			used[L[i]] = i;
		}
		ans += i - A[i] + 1;
	}
	return ans;
}

int main(){
	freopen("secv5.in", "r", stdin);
	freopen("secv5.out", "w", stdout);

	scanf("%d %d %d", &N, &l, &u);
	for (unsigned int i = 1, x; i <= N; ++i)
		scanf("%d", &x),
		L[i] = insert_val(x);
	
	printf("%u\n", compute(u) - compute(l - 1));

	return 0;
}