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

using namespace std;

bool V[ 1003 ];
int T[ 1003 ];
int Z[ 1003 ];
int T2[ 1003 ];

int main() {
    int d = podajD();
    int r = podajR();
    for ( int i=0; i<d; i++ ) {
        T[i]=0;
        V[i]=0;
    }
    int mx=0;
    for ( int oo=0; oo<d&&mx<r; oo++ ) {
        int p=0,k=d-1;
        //for ( int i=0; i<d; i++ ) printf("%d ",T[i]); printf("\n");
        while ( p<k ) {
            int s = (p+k+1)>>1;
            for ( int i=0; i<d; i++ ) if (!V[i]) T2[i]=1; else T2[i]=T[i]+1;
            for ( int i=p; i<=k; i++ ) if (!V[i]) {
                T2[i]=((i<s)?0:1);
            }
            czyCieplo(T2);
            for ( int i=p; i<=k; i++ ) if (!V[i]) T2[i]=1;
            if (czyCieplo(T2)) k=s-1; else p=s;
        }
        //printf("uuuuu %d\n",p);
        int cc = p;
        if ( V[cc] ) {
            for ( int i=0; i<d; i++ ) if (!V[i]) T[i]=0;
            znalazlem(T);
        }
        /*for ( int i=0; i<d; i++ ) if (!V[i]) T[i]=1;
        T[cc]=0;
        czyCieplo(T);
        T[cc]=1;
        if ( !czyCieplo( T ) ) {
            for ( int i=0; i<d; i++ ) if (!V[i]) T[i]=0;
            znalazlem(T);
        }//*/
        for ( int i=0; i<d; i++ ) if (!V[i]) T[i]=0;
        T[cc]=0; V[cc]=1;
        p = 0; k = r-mx;
        while ( p+1<k ) {
            int s = (p+k)>>1;
            czyCieplo( T );
            for ( int i=0; i<d; i++ ) if ( V[i] ) T2[i]=T[i]+s; else T2[i]=0;
            int b1 = czyCieplo(T2);
            if ( b1 ) {
                for ( int i=0; i<d; i++ ) if ( V[i] ) T2[i]++;
                int b2 = czyCieplo(T2);
                if ( b2 ) p=s; else k=s;
            } else k=s;
        }
        //printf("    %d %d\n",p,k);
        if ( p != k ) {
            int s = k;
            for ( int i=0; i<d; i++ ) if ( V[i] ) T2[i]=T[i]+s; else T2[i]=0;
            czyCieplo(T2);
            for ( int i=0; i<d; i++ ) if ( V[i] ) T2[i]--;
            if ( !czyCieplo(T2) ) {
                for ( int i=0; i<d; i++ ) if ( V[i] ) T2[i]++;
                if ( czyCieplo(T2) ) p=k;
            }
        }
        for ( int i=0; i<d; i++ ) if ( V[i] ) T[i]+=p;
        mx+=p;
        //printf("aaaaaa %d %d\n",mx,cc);
    }
    //for ( int i=0; i<d; i++ ) printf("%d ",T[i]); printf("\n");
    znalazlem( T );
    return 0;
}