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

void odwroc(int* proba1, int* proba2, int* begin, int* end, int d)
{
    for(int i = 0; i < d; i++)
    {
        proba2[i] = (proba1[i] == begin[i]) ? end[i] : begin[i];
    }
}


bool czyKoniec(int* begin, int* end, int d)
{
    for(int i = 0; i < d; i++)
    {
        if(begin[i] != end[i])
            return false;
    }
    return true;
}

void kopiuj(int* from, int* to, int d)
{
    for(int i = 0; i < d; i++)
    {
        to[i] = from[i];
    }
}

void odwrocParzyste(int* from1, int* from2, int* to, int d, bool parzyste)
{
    for(int i = 0; i < d; i++)
    {
        to[i] = ((i % 2) == parzyste) ? from1[i] : from2[i];
    }
}

void podzielNaPol(int* begin, int* end, int d, bool zDolu, bool parzyste)
{
    for(int i = 0; i < d; i++)
    {
        if(parzyste && (i % 2 == 1) )
            continue;
        if(!parzyste && (i % 2 == 0) )
            continue;

        if(zDolu)
            begin[i] = (begin[i] + end[i] + 1)/2;
        else
            end[i] = (begin[i] + end[i])/2;
    }
}
void wypisz(int* in, int d)
{
    for(int i = 0; i < d; i++)
        std::cout << in[i] << ", ";
    std::cout << "\n";
}


int main() {
    int r = podajR();
    int d = podajD();
//    int begin[2];
//    int end[2];
//    int proba1[2];
//    int proba2[2];
//    int proba3[2];
//    int proba4[2];
    int begin[d];
    int end[d];
    int proba1[d];
    int proba2[d];
    int proba3[d];
    int proba4[d];
    for(int i = 0; i < d; i++)
    {
        begin[i] = 0;
        end[i] = r;
    }
    bool cieplo1;
    bool cieplo2;
    bool parzyste = false;
    while(czyKoniec(begin, end, d) == false)
    {
//        wypisz(begin, d);
//        wypisz(end, d);

        parzyste = !parzyste;

        kopiuj(begin, proba1, d);
        czyCieplo(proba1);
        odwroc(proba1, proba2, begin, end, d);
        cieplo1 = czyCieplo(proba2);
        if(d == 1)
        {
            int diff = end[0] - begin[0];
            if(cieplo1)
                begin[0] = (begin[0] + end[0] + 1)/2;
            else
                end[0] = (begin[0] + end[0])/2;
            continue;
        }
        odwrocParzyste(begin, end, proba3, d, parzyste);
        czyCieplo(proba3);
        odwroc(proba3, proba4, begin, end, d);
        cieplo2 = czyCieplo(proba4);

        // jezeli cieplo1 to zdejmujemy z gory, jezeli
        bool cos = ((cieplo1 && cieplo2) || (!cieplo1 && !cieplo2)) xor parzyste;
        podzielNaPol(begin, end, d, cieplo1, cos);

    }

    znalazlem(begin);
}