Cod sursa(job #2743052)

Utilizator DragosC1Dragos DragosC1 Data 22 aprilie 2021 15:12:33
Problema Perle Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <fstream>
#include <algorithm>
#include <iostream>
using namespace std;

int lung[11];
int nr[11][10001];
int n, ind;

void read() {
    int i, j;
    ifstream f("perle.in");
    f >> n;
    for (i = 1; i <= n; i++) {
        f >> lung[i];
        for (j = 1; j <= lung[i]; j++)
            f >> nr[i][j];
    }
    f.close();
}

int B(int);
int C(int);

inline int B(int i) {
    if (ind >= lung[i])
        return 0;
    if (nr[i][ind] == 2) {
        ind++; 
        return B(i);
    }
    else if (nr[i][ind] == 1) {
        if (ind + 4 <= lung[i] && nr[i][ind + 2] == 3) {
            ind += 4;
            return C(i);
        }
    }
    return 0;
}

inline int C(int i) {
    if (ind > lung[i])
        return 0;
    if (ind == lung[i] && nr[i][ind] == 2) {
        ind++;
        return 1;
    }
    else if (ind + 2 == lung[i] && nr[i][ind] == 1 && nr[i][ind + 1] == 2) {
        ind += 2;
        return 1;
    }
    else if (ind + 2 <= lung[i]){
        B(i);
        if (ind > lung[i])
            return 0;
        else 
            return C(i);
    }
    return 0;
}

inline bool aflare(int i) {
    if (lung[i] == 1 || (lung[i] == 3 && nr[i][1] == 1 && nr[i][2] == 2))
        return 1;
    if (nr[i][ind] == 1 || nr[i][ind] == 2) 
        return B(i);
    return C(i);
}

void solve() {
    int i;
    ofstream g("perle.out");
    for (i = 1; i <= n; i++) {
        ind = 1;
        g << aflare(i) << '\n';
    }
    g.close();
}

int main() {
    read();
    solve();
    return 0;
}