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
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include "cielib.h"

#define MAX_INT 1000000000
#define OVER_MAX_INT 1000000000
#define MAX_DIM 600


int rogDolny[MAX_DIM];
int rogGorny[MAX_DIM];
int wynik[MAX_DIM];
int mid[MAX_DIM];
int k,d,r;
int total;

int rozneRogi(){
	for(int i = 0; i < d; i++) if (rogDolny[i] != rogGorny[i]) return 1;
	return 0;
}
/*
int kostka(){
	int res = 0;
	for(int i = 0; i < d; i++) if (abs(rogDolny[i] - rogGorny[i]) == 1) res++;
	assert(res ==  0 || res == d);
	return res == d;
}*/

int zaciesnia(int dim){
	int midPocz[MAX_DIM];
	int midKon[MAX_DIM];
	if (rogDolny[dim] == rogGorny[dim]) return 0;
	for(int i = 0; i < d; i++){
		midPocz[i] = midKon[i] = (rogDolny[i] + rogGorny[i]) / 2;//nie wiadomo co zrobic z nieparzysta suma, chyba trzeba sprawdzic 2 opcje
	}

	if (rogGorny[dim] - rogDolny[dim] == 1){
		rogGorny[dim] += MAX_INT;
		rogDolny[dim] -= MAX_INT;
		czyCieplo(rogGorny);
		if (czyCieplo(rogDolny)){//lepszy jest dolny
			rogGorny[dim]--;
		} else {//lepszy jest gorny
			rogDolny[dim]++;
		}
		rogGorny[dim] -= MAX_INT;
		rogDolny[dim] += MAX_INT;
		total += 2;
		return 1;
	};//ujednolic


	midPocz[dim] = rogDolny[dim];
	midKon[dim] = rogGorny[dim];
	int middle = (midPocz[dim] + midKon[dim])/2;
	czyCieplo(midPocz);
	total += 2;
	if (czyCieplo(midKon) == 1) {
		rogDolny[dim] = middle + 1;
		return 1;
	};
	total += 1;
	if (czyCieplo(midPocz) == 1) {
		rogGorny[dim] = middle;//gdyz odpowiedz bedize prawdziwa tylko jesli bedize ostra nierownosc
		return 1;
	};
	return 0;
}
/*
void dostosuj(){
	for(int i = 0; i < d; i++) {wynik[i] = rogDolny[i];}

	for(int i = 0; i < d; i++){

		rogGorny[i]++;
		czyCieplo(rogGorny);
		rogGorny[i]--;
		if (czyCieplo(rogDolny) == 0) wynik[i]++;//bo wysuniecie nie pogorszylo, czyli trzeba podbic
	}

}*/

void print(){
	for(int i = 0; i < d; i++){printf("%d ",rogDolny[i]);}
	printf("\n");
	for(int i = 0; i < d; i++){printf("%d ",rogGorny[i]);}
	printf("\n");
}


int main(){
	int iteracje = 0;
	//freopen("test_auto.txt","r", stdin);
	d = podajD();
	k = podajK();
	r = podajR();
	for(int i = 0; i < d; i++) {rogDolny[i] = 0;rogGorny[i] = r;}
	//print();
	while(rozneRogi()){
		int poprawil = 0;
		//printf("+++++++++++++++++++++++++++++++++++ITERACJA %d\n",total);
		iteracje++;
		for(int i = 0; i < d; i++) {
			if (zaciesnia(i)){
				//printf("WYMIAR %d\n",i);
				//print();
				poprawil = 1;
				//break;
			}
		}
//		assert(poprawil == 1);
		if (poprawil == 0) break;//to oznacza ze punkt jest na przecieciu wszystkich wymairow
	}
	//printf("KONIEC %d %d\n",total, iteracje);

	//print();
	//if (kostka()){
	//	printf("KOSTKA\n");
	//	dostosuj();
	//} else {
		//printf("==============================================\n");
		for(int i = 0; i < d; i++) wynik[i] = (rogDolny[i] + rogGorny[i])/2;//mozemy nie skonczyc w punkcie
	//}
	znalazlem(wynik);
	//fclose(stdin);
	return 0;
}