Cod sursa(job #1459639)

Utilizator theprdvtheprdv theprdv Data 10 iulie 2015 14:13:45
Problema Secventa 5 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <cstring>
#define MAXN (1 << 20) + 2
#define MOD 666013
#define list (x % MOD)

using namespace std;

unsigned int N, no, l, u, L[MAXN], used[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 long long compute(unsigned int c){
	if (c < 1) return 0;
	memset(used, 0, (N + 1) * sizeof(unsigned int));
	unsigned long long ans = 0, j = 1;

	for (unsigned int i = 1; i <= N; ++i){
		if (!used[L[i]] && c) --c;
		else if (used[L[i]] < j){
			for (; used[L[j]] > j; ++j);
			++j;
		}
		used[L[i]] = i;
		ans += (i - j + 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("%ud", &x),
		L[i] = insert_val(x);

	printf("%lld", compute(u) - compute(l - 1));

	return 0;
}