fork download
#include <cstdio>
#include <cstdlib>
 
const int N = 100, TRY = 100000;
 
int n, h[N], obs[N];
 
bool place() {
	double tang, t;
	int i, j, best;
	for (i = 0; i < n; ++i)
		h[i] = rand();
	for (i = 0; i < n - 1; ++i) {
		tang = -1e18; // Тангенс угла близкого к -Pi/2
		best = i + 1; // Тут будет номер горы с максимальным тангенсом.
		for (j = i + 1; j < n; ++j) { // Начинаем с следующей горы.
			t = double(h[j] - h[i]) / double(j - i);
			if (tang < t) {
				best = j;
				tang = t;
			}
		}
		// Если гора с максимальным тангенсом
		// не совпадает с указанной в условии...
		if (best != obs[i])
			return false;
	}
	return true;
}
 
int main() {
	/*/
	freopen("C:\\Users\\anonymous\\Downloads\\C-small-practice.in", "r", stdin);
	freopen("C:\\Users\\anonymous\\Desktop\\out.txt", "w", stdout);
	/**/
	int t, it, i;
	scanf("%d", &t);
	for (it = 1; it <= t; ++it) {
		scanf("%d", &n);
		for (i = 0; i < n - 1; ++i) {
			scanf("%d", &obs[i]); // Читаю обозримую вершину.
			--obs[i]; // Привожу к нумерации с нуля.
		}
		for (i = 0; i < TRY; ++i) // Делаю TRY попыток расставить высоты.
			if (place())
				break;
		printf("Case #%d:", it);
		if (i == TRY) {
			printf(" Impossible");
		} else {
			for (i = 0; i < n; ++i)
				printf(" %d", h[i]);
		}
		putchar('\n');
	}
	return 0;
}
Success #stdin #stdout 0.03s 2728KB
stdin
4
6
2 3 4 5 6
4
4 4 4
4
3 4 4
4
4 3 4
stdout
Case #1: 881759 1951761153 2042122590 2083782853 1756095042 791396296
Case #2: 1788175905 110793789 218743872 1144741933
Case #3: Impossible
Case #4: 1580161787 923466739 1494465807 2030566429