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
130
131
132
133
134
135
#include "cielib.h"
#include <cstdio>
#include <algorithm>
using namespace std;	
int poz[507];
int ppoz[507];
int odwr[507];
int w[507];

int main() {
	int d = podajD();
	int kk = podajK();
	int r = podajR();
	
	if(d == 1) {
		int p = 0;
		int k = r - 1;
		int ww = 0;
	
		while(p <= k) {
			int s = (p + k) / 2;
			poz[0] = s;
			czyCieplo(poz);
			poz[0]++;
			if(czyCieplo(poz)) {
				ww = s + 1;
				p = s + 1;
			}		
			else k = s - 1;
		}
		
		poz[0] = ww;
		znalazlem(poz);
		return 0;
	}
	
	for(int i = 0; i < d; ++i) poz[i] = r / 2;
	
	for(int i = 0; i < d; ++i) {
		poz[i] = 0;
		czyCieplo(poz);
		poz[i] = 1;
		if(czyCieplo(poz)) {
			poz[i] = min(r, 1 + (r / 2));
		}
		else {
			poz[i] = r;
			czyCieplo(poz);
			poz[i] = r - 1;
			if(czyCieplo(poz)) {
				poz[i] = max(0, -1 + (r / 2));
			}
			else poz[i] = r / 2;
		}
		
	}
	
	for(int i = 0; i < d; ++i) {
		poz[i] = 0;
		czyCieplo(poz);
		poz[i] = 1;
		odwr[i] = 0;
		if(!czyCieplo(poz)) odwr[i] = 1;
		
		if(!odwr[i]) {
			int p = 0;
			int k = r - 1;
			w[i] = 0;
			while(p <= k) {
				int s = (p + k) / 2;
				poz[i] = s;
				czyCieplo(poz);
				poz[i] = s + 1;
				if(czyCieplo(poz)) {
					w[i] = s;
					p = s + 1;
				}	
				else k = s - 1;
			}
			
			poz[i] = w[i] + 1;
		}
		else {
			int p = 1;
			int k = r;
			w[i] = r + 1;
			while(p <= k) {
				int s = (p + k) / 2;
				poz[i] = s;
				czyCieplo(poz);
				poz[i] = s - 1;
				if(czyCieplo(poz)) {
					w[i] = s;
					k = s - 1;
				}	
				else p = s + 1;
			}
			poz[i] = w[i] - 1;
		}
	}	
	
	int p = 0;
	int k = r;
	int ww = 0;
	for(int i = 0; i < d; ++i) {
		if(odwr[i]) k = min(k, poz[i]);
		else k = min(k, r - poz[i]);
	}
	k--;
	
	while(p <= k) {
		int s = (p + k) / 2;
		for(int i = 0; i < d; ++i) {
			if(odwr[i]) ppoz[i] = poz[i] - s;
			else ppoz[i] = poz[i] + s;
		}
		czyCieplo(ppoz);
		for(int i = 0; i < d; ++i) {
			if(odwr[i]) ppoz[i]--;
			else ppoz[i]++;
		}
		if(czyCieplo(ppoz)) {
			ww = s + 1;
			p = s + 1;
		}
		else k = s - 1;
	}
	
	for(int i = 0; i < d; ++i) {
		if(odwr[i]) poz[i] -= ww;
		else poz[i] += ww;
	}
	znalazlem(poz);
	return 0;	
}