1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
//Mateusz Piórkowski
#include <iostream>
#include <vector>
#include <set>

int main(){
	std::ios_base::sync_with_stdio(false);
	std::cin.tie(NULL);

	int n, k;
	std::cin >> n >> k;

	int* butelki = new int[n];
	std::set<int> marki;
	for(int i=0; i<n; i++){ //Get marki and butelki
		int marka;
		std::cin >> marka;
		butelki[i] = marka;
		marki.insert(marka);
	}
	if(marki.size() < k){
		std::cout << -1 << "\n";
		return 0;
	}
	int* pierwsza_pos = new int[n]; //First position marki
	for(int i=0; i<n; i++) pierwsza_pos[i]=-1;

	int64_t output=0;
	int marki_na_skraju=0;
	for(int i=0; i<n; i++){
		int marka = butelki[i];
		if(pierwsza_pos[marka-1] == -1){ //First
			pierwsza_pos[marka-1] = i;
			if(i>=k){ //Nie na skraju
				output+=i;
				marki_na_skraju+=1;
			}else{	//Na skraju
				marki_na_skraju+=1;
			}
			if(marki_na_skraju==k){ //Tyle marek ile miało być
				std::cout << output << "\n";
				return 0;
			}
		}else{ //Repeated
			if(i<k){ //Na skraju
				output-=i;
			}
		}
	}

	/*std::cout << "Butelki:\n";
	for(int i=0; i<n; i++){
		std::cout << butelki[i] << "\n";
	}
	std::cout << "Marki:\n";
	for(int i : marki){
		std::cout << i << "\n";
	}
	std::cout << "Pierwsza_pos:\n";
	for(int i=0; i<marki.size(); i++){
		std::cout << pierwsza_pos[i] << "\n";
	}*/
	std::cout << output << "\n";
}