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

int* poz;
int* max;

inline void idz_dalej(int dim) {
    //printf("poz[%i]=%i max[%i]=%i => ", dim, poz[dim], dim, max[dim]);
    int s = max[dim]+poz[dim];
    poz[dim] = s/2 + (s%2!=0); //ceiling
    //printf("poz[%i]=%i max[%i]=%i\n", dim, poz[dim], dim, max[dim]);
}    


inline void idz_blizej(int dim) {
    //printf("poz[%i]=%i max[%i]=%i => ", dim, poz[dim], dim, max[dim]);
    max[dim] = (max[dim]+poz[dim])/2;        
    //printf("poz[%i]=%i max[%i]=%i\n", dim, poz[dim], dim, max[dim]);
}


inline int width(int dim) {
    //printf("poz[%i]=%i max[%i]=%i\n", dim, poz[dim], dim, max[dim]);
    return max[dim]-poz[dim] ;
}



int main() {
	int d = podajD();
    int r = podajR();
    poz = new int[d];
    max = new int[d];

    std::vector<int> cale;
    std::vector<int> polowki;
    
	for (int i=0; i<d; ++i) {
        poz[i] = 0;
        max[i] = r;
        cale.push_back(i);
	}


    while (width(0)>0) {
        //printf("width(0)=%i\n", width(0));

        while (cale.size()>0) {

            int wszystkie = cale.size();
            std::vector<int> bez_zmiany;
            while (cale.size()>0) {
                //printf("cale.size()=%i\n", cale.size());
                int dim = cale.back(); cale.pop_back();
                
                czyCieplo(poz);
                int prev_poz = poz[dim]; 
                poz[dim] = max[dim]; 
                int cieplej_dalej = czyCieplo(poz); 
                poz[dim] = prev_poz;

                if (cieplej_dalej>0) {
                    polowki.push_back(dim); idz_dalej(dim); 
                } else 
                {
                    int cieplej_blizej = czyCieplo(poz);
                    if (cieplej_blizej>0) {
                        polowki.push_back(dim); idz_blizej(dim); 
                    } else {
                        bez_zmiany.push_back(dim);
                    }
                }
            }//while

            //printf("bez_zmiany.size()=%i wszystkie=%i\n", bez_zmiany.size(), wszystkie);

            if (bez_zmiany.size()==wszystkie) {
                while (bez_zmiany.size()>0) {
                    int dim = bez_zmiany.back(); bez_zmiany.pop_back();
                    polowki.push_back(dim); idz_dalej(dim); 
                }
            } //if

            cale = std::move(bez_zmiany); bez_zmiany.clear();
        } //while cale.size()>0

        //printf("changing bounds to %i\n", width(0));
        cale = std::move(polowki); polowki.clear();                 
    } 
    
    //for (int i=0; i<d; ++i) printf("poz[%i]=%i\n", i, poz[i]);
	znalazlem(poz);
}