- #include <iostream> 
- #include <algorithm> 
- #include <vector> 
- #include <climits> 
- using namespace std; 
-   
- //Структура для представления одного отрезка 
- struct Line { 
- 	int price; 
- 	int length; 
- }; 
-   
- //Функция сортировщик по цене в порядке возрастания 
- bool comparator_price (Line i, Line j) {  
- 	return i.price < j.price; 
- } 
-   
- int main() { 
- 	int n, price, length, cheapest = INT_MAX; 
- 	cin >> n; 
- 	Line lines_by_price[n]; 
-   
- 	for (int i = 0; i < n; i++) { 
- 		Line l; 
- 		cin >> length >> price; 
- 		l.price = price; 
- 		l.length = length; 
- 		lines_by_price[i] = l; 
- 	} 
-   
- 	//Сортируем все отрезки по цене, чтобы была возможность "отсечь" 
- 	//слишком дорогие отрезки, когда цена одного(или двух) будет  
- 	//больше текущей минимальной 
- 	sort(&lines_by_price[0], &lines_by_price[n], comparator_price); 
-   
- 	for (int i = 0; i < n; i++) { 
- 		Line first_side = lines_by_price[i]; 
- 		if (first_side.price > cheapest) break; 
- 		vector<Line> sides = {}; 
- 		//Перебираем все возможные тройки отрезков, отсекая 
- 		//слишком дорогие, основываясь на сортировке по цене 
- 		//и текущей минимальной цене 
- 		for (int j = 0; j < n; j++) { 
- 			if (lines_by_price[j].price != first_side.price && lines_by_price[j].length <= first_side.length) { 
- 				sides.push_back(lines_by_price[j]); 
- 				Line second_side = lines_by_price[j]; 
- 				if (first_side.price + second_side.price > cheapest) break; 
- 				for (auto third_side: sides) { 
- 					if ((third_side.length != second_side.length && third_side.price != second_side.price)  
- 					&& first_side.length < second_side.length + third_side.length  
- 					&& second_side.length < first_side.length + third_side.length  
- 					&& third_side.length < second_side.length + first_side.length) { 
- 						if (first_side.price + second_side.price + third_side.price < cheapest) { 
- 							cheapest = first_side.price + second_side.price + third_side.price; 
- 						} 
- 						break; 
- 					} 
- 				} 
- 			} 
- 		} 
- 	} 
- 	//Если ни одна тройка отрезков не подошла, значит составить 
- 	//треугольник невозможно - выводим "-1" 
- 	if (cheapest == INT_MAX) cheapest = -1; 
- 	cout << cheapest; 
- 	return 0; 
- }