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
#include <bits/stdc++.h>
#include "cielib.h"
using namespace std;

#ifndef _WIN32
    #define getchar getchar_unlocked
#endif

#define MP make_pair
#define PB push_back
#define ST first
#define ND second

typedef long long int LLI;
typedef unsigned long long int LLU;
typedef long double LD;
typedef pair<int, int> pii;
typedef pair<long long int, long long int> pll;
typedef vector<int> vi;

int n;
bool done[507];
int poczatek[507];
int koniec[507];
int aktualne[507];

void binsearch(int roz)
{
    for(int i = 0; i < n; ++i)
        aktualne[i] = (poczatek[i] + koniec[i]) / 2;
    if(roz == 3)
    {
        for(int i = 0; i < n; ++i){
            if(done[i] == 0){
                aktualne[i] = poczatek[i];
                czyCieplo(aktualne);
                aktualne[i] = koniec[i];
                if(czyCieplo(aktualne) == 1){
                    poczatek[i] = koniec[i];
                    aktualne[i] = koniec[i];
                }
                else{
                    aktualne[i] = poczatek[i];
                    if(czyCieplo(aktualne) == 1){
                        koniec[i] = poczatek[i];
                        aktualne[i] = poczatek[i];
                    }
                    else{
                        poczatek[i] = (poczatek[i] + koniec[i]) / 2;
                        koniec[i] = poczatek[i];
                        aktualne[i] = poczatek[i];
                    }
                }
                done[i] = 1;
            }
        }
    }
    else if(roz % 2 == 1)
    {
        for(int i = 0; i < n; ++i){
            if(done[i] == 0){
                int poprz = aktualne[i];
                aktualne[i] = poczatek[i];
                czyCieplo(aktualne);
                aktualne[i] = koniec[i];
                if(czyCieplo(aktualne) == 1)
                    poczatek[i] = (poczatek[i] + koniec[i]) / 2;
                else{
                    aktualne[i] = poczatek[i];
                    if(czyCieplo(aktualne) == 1)
                        koniec[i] = (poczatek[i] + koniec[i]) / 2;
                    else{
                        poczatek[i] = (poczatek[i] + koniec[i]) / 2;
                        koniec[i] = poczatek[i];
                        aktualne[i] = poczatek[i];
                        done[i] = 1;
                    }
                }
                aktualne[i] = poprz;
            }
        }
        binsearch(roz / 2 + 1);
    }
    else
    {
        for(int i = 0; i < n; ++i){
            if(done[i] == 0){
                int poprz = aktualne[i];
                aktualne[i] = poczatek[i];
                czyCieplo(aktualne);
                aktualne[i] = koniec[i];
                if(czyCieplo(aktualne) == 1)
                    poczatek[i] = (poczatek[i] + koniec[i]) / 2;
                else
                    koniec[i] = ((poczatek[i] + koniec[i]) / 2) + 1;
                aktualne[i] = poprz;
            }
        }
        binsearch(roz / 2 + 1);
    }
}

int main()
{
    n = podajD();
    int m = podajR();
    for(int i = 0; i < n; ++i)
        poczatek[i] = 0,
        koniec[i] = m;
    binsearch(m + 1);
    int* wyn = new int[n];
    for(int i = 0; i < n; ++i)
        wyn[i] = poczatek[i];
    znalazlem(wyn);
}