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
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>

#include "cielib.h"

using namespace std;

#define D 500

int main () {
	int tab[D];
	int minX[D];
	int maxX[D];
	int wyniki[D];
	int rezultat[D];
	
	int d = podajD();
	int r = podajR();
	
	fill_n(minX, D, 0);
	fill_n(maxX, D, r);

	int liczba_rownych = 0;
	
	// Faza pierwsza - punkt bedzie odlegly o max 1
	while(liczba_rownych != d) {
		liczba_rownych = 0;
		
		// Dla kazdego wymiaru dwa testy
		for (int i = 0; i < d; i++) {
			// Pomijam, jesli dla danego wymiaru roznica jest mala
			if (minX[i] != maxX[i] - 1) {
				// Pierwsze sprawdzenie
				for (int j = 0; j < d; j++) {
					if (j == i) {
						tab[j] = minX[j];
					
					} else {
						tab[j] = (minX[j] + maxX[j]) / 2;
					}
				}
				
				czyCieplo(tab);
				
				// Drugie sprawdzenie
				for (int j = 0; j < d; j++) {
					if (j == i) {
						tab[j] = maxX[j];
					
					} else {
						tab[j] = (minX[j] + maxX[j]) / 2;
					}
				}
				
				// Zapamietanie wyniku
				wyniki[i] = czyCieplo(tab);
			}
		}
		
		for (int i = 0; i < d; i++) {
			// Pomijam, jesli dla danego wymiaru roznica jest mala
			if (minX[i] != maxX[i] - 1) {
				int dodac = (maxX[i] - minX[i]) % 2 == 0 ? 0 : 1;
				
				if (wyniki[i] == 0) {
					maxX[i] = dodac + (minX[i] + maxX[i]) / 2;
				
				} else {
					minX[i] = (minX[i] + maxX[i]) / 2;
				}	
			}
			
			if (
				(minX[i] == maxX[i]) ||
				(minX[i] == maxX[i] - 1) ||
				false
			) {
				liczba_rownych++;
			}
		}
	}
	
	// Faza druga - znalezienie wlasciwego punktu
	for (int i = 0; i < d; i++) {
		int  zapamietaj = minX[i];
		bool czy_w_lewo = minX[i] > 0;
		
		if (czy_w_lewo) {
			minX[i]--;
			
			czyCieplo(minX);
			
			minX[i]++;
			
			int wynik = czyCieplo(minX);
			
			if (wynik == 0) {
				rezultat[i] = minX[i];
			
			} else {
				rezultat[i] = minX[i] + 1;
			}
		
		} else {
			minX[i] = minX[i] + 2;
			
			czyCieplo(minX);
			
			minX[i]--;
			
			int wynik = czyCieplo(minX);
			
			if (wynik == 0) {
				rezultat[i] = minX[i];
			
			} else {
				rezultat[i] = minX[i] - 1;
			}
		}
				
		minX[i] = zapamietaj;
	}
	
	znalazlem(rezultat);
	
	return 0;
}