Niestety, nie byliśmy w stanie w pełni poprawnie wyświetlić tego pliku, ponieważ nie jest zakodowany w UTF-8. Możesz pobrać ten plik i spróbować otworzyć go samodzielnie.
  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
129
130
#include <cstdio>
int z[1000005];
int main(){
    int n,t;
    bool debug = false;
    scanf(" %d",&t);
    while(t--){
        bool ciagly = true;
        int pocz = -1, kon = -1;
        scanf("%d",&n);
        for(int i=0; i<n; i++){
            scanf("%d",&z[i]);
            if( kon >= 0 && z[i] > 0 && z[i-1] == 0 )
                ciagly = false;
            if( pocz >= 0 && z[i]>0 )
                kon = i;
            if( pocz<0 && z[i]>0 ) {
                pocz = i;
                kon = i;
            }
        }
        //sprawdz czy wogole byly jakies wyliczanki, albo czy moze wskazano na jedn� zabawke
        if(pocz == kon){
            if(pocz == -1)
                printf("NIE\n");
            else if (z[pocz] == 1)
                printf("TAK\n");
            else
                printf("NIE\n");

        //zobacz czy nie ma dwoch rozlacznych ciagow
        } else if(!ciagly){
            printf("NIE\n");

        //przypadek gdy wyliczane sa tylko dwie zabawki
        } else if(pocz == kon-1){
            if( (z[pocz] - z[kon] >= -1 ) && (z[pocz] - z[kon] <= 1 ) )
                printf("TAK\n");
            else
                printf("NIE\n");
        //przypadek gdy jest wyliczanych wiecej niz trzy
        } else {

            //jesli zabawki z brzegow maja wartosc wieksza to tak sie nie da
            if(( z[pocz] > z[pocz+1] ) || ( z[kon] > z[kon-1] )){
                printf("NIE\n");
                continue;
            }

            //jesli sa tylko 3 to moze sie zawijac do srodka (na srodku zaczyna i konczy)
            if(kon-pocz==2){
                if( (z[pocz+1]>z[pocz] )&&(z[pocz+1]>z[pocz+2]) ){
                    if ((z[pocz+1]  >= (z[pocz] + z[pocz+2]) - 1 )&&(z[pocz+1]  <= (z[pocz] + z[pocz+2]) + 1 )){
                        printf("TAK\n");
                        continue;
                    } else {
                        printf("NIE\n");
                        continue;
                    }
                }

            }
            /*
            //jesli jest ciag jedynek z lewej i prawej strony
            if(kon-pocz>=4){
                    //printf("test %d %d %d %d",z[pocz+1] , z[pocz+2] , z[pocz+4] , z[pocz+5]);
                bool zly = false;
                for(int i=pocz; i<=kon-3; i++)
                if(( z[i] + z[i+2] + z[i+3] == 3)&&(z[i+1]>1)){
                    printf("NIE\n");
                    zly = true;
                    break;
                }
                if(zly)
                    continue;

            }*/

            //tak samo sie nie da jesli wyliczanka zawija sie do srodka przy sasiednich dwoch a jest wiecej niz 3
            if(kon-pocz>=2){
                if(( z[pocz+1] > (z[pocz] + z[pocz+2]) ) || ( z[kon-1] > (z[kon] + z[kon-2]))){
                    printf("NIE\n");
                    continue;
                }
            }
           // bool razOdjete=false;
            if(debug) printf("p:%d k:%d ",pocz,kon);
            for(int i=pocz; i<kon; i++){

                //obadaj czyz to aby nie jest waskie gardlo (przynajmniej 4 pola do przodu)
                if(( kon-i >= 4 ) ){
    /*
                    //sprawdz czy nie zaczynac wyliczania od drugiego elementu od lewej
                    if( (i == pocz)  && (!razOdjete) && (z[i] < z[i+1])){
                        z[i+1]--;
                        i--;
                        razOdjete = true;
                        continue;
                    }
      */
                    if((z[i+1]==1)&&( z[i+1] < z[i+2] )&&( z[i+3] < z[i+2] )){

                        printf("NIE\n");
                        break;
                    }
                    //if(z[i]==1 && z[i+1] ==1 && i<kon-1)
                    //    continue;
                }

                //odejmij roznice ruchow z nastepnego pola od pola poprzedniego (ilosc odwiedzanych kierunkow)
                z[i+1] -= z[i];

                //przypadek brzegowy
                if( i == kon-1 ) {
                    if((z[i+1] == 0) || (z[i+1] == -1) || (z[i+1] == 1))
                        printf("TAK\n");
                    else
                        printf("NIE\n");
                    break;
                }
                //nie da sie isc wiecej razy w lewa strone niz w prawa
                if(z[i+1] < 0){
                    printf("NIE\n");
                    break;
                }
            }
        }
    }
    return 0;
}