#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
/**
* PART 1: Predicts rounds based on "higher rank always wins".
* Optimized to process the simulation in-place to save memory.
*/
void predictTournament(vector<int> players) {
int round = 1;
int currentSize = players.size();
while (currentSize > 0) {
cout << "Round " << round << ": ";
for (int i = 0; i < currentSize; ++i) {
cout << players[i] << (i == currentSize - 1 ? "" : ", ");
}
cout << endl;
if (currentSize == 1) break;
// Winners are moved to the front half of the vector
for (int i = 0; i < currentSize; i += 2) {
players[i / 2] = min(players[i], players[i + 1]);
}
currentSize /= 2;
round++;
}
}
/**
* PART 2: Generates a balanced draw (Power of 2).
* Ensures top seeds meet as late as possible.
*/
vector<int> generateBalancedDraw(int n) {
vector<int> draw;
draw.reserve(n);
draw.push_back(1);
draw.push_back(2);
while (draw.size() < n) {
vector<int> nextDraw;
nextDraw.reserve(draw.size() * 2);
// Sum property: Seed + Opponent = (Current Pool Size * 2) + 1
int targetSum = (draw.size() * 2) + 1;
for (int seed : draw) {
nextDraw.push_back(seed);
nextDraw.push_back(targetSum - seed);
}
draw = move(nextDraw); // Use move semantics for efficiency
}
return draw;
}
int main() {
int n = 8;
cout << "--- Part 2: Balanced Draw Generator ---" << endl;
vector<int> draw = generateBalancedDraw(n);
for (int i = 0; i < draw.size(); ++i) {
cout << draw[i] << (i == draw.size() - 1 ? "" : " ");
}
cout << "\n\n";
cout << "--- Part 1: Tournament Prediction ---" << endl;
predictTournament(draw);
return 0;
}