Cod sursa(job #1466253)

Utilizator GeiGeiGeorge Cioroiu GeiGei Data 28 iulie 2015 20:10:42
Problema Perle Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.86 kb
#include <cstdio>
#include <iostream>
#include <vector>
#include <set>
#include <cmath>
#include <climits>
#include <list>
#include <iomanip>
#include <cstdlib>
#include <fstream>
#include <map>
#include <algorithm>

using namespace std;

int main() {
    freopen("perle.in", "r", stdin);
    freopen("perle.out", "w", stdout);

    ios_base::sync_with_stdio(false);
    cin.tie(0);

    int t;
    cin >> t;
    for (int i = 1; i <= t; i++) {
        int n;
        cin >> n;
        int* v = new int[n + 1];
        for (int i = 1; i <= n; i++) {
            cin >> v[i];
        }
        if (n == 1) {
            cout << "1\n";
            continue;
        }
        int poz = 1, nC = 0;
        while (poz <= n && v[poz] == 2) {
            poz++;
        }
        if (poz == n || v[poz] == 3) {
            goto tryC;
        }
        if (poz + 4 <= n && v[poz + 2] == 3) {
            nC = 1;
            poz += 4;
        } else {
            goto tryC;
        }
        while (poz <= n && nC != 0) {
            nC--;
            if (v[poz] == 2) {
                poz++;
            } else if (v[poz] == 1) {
                if (v[poz + 1] != 2) {
                    goto tryC;
                }
                poz += 3;
            } else {
                if (v[poz] != 3) {
                    goto tryC;
                }
                poz++;
                while(poz <= n && v[poz] == 2) {
                    poz++;
                }
                if (poz == n || v[poz] == 3) {
                    goto tryC;
                }
                if (poz + 4 <= n && v[poz + 2] == 3) {
                    poz += 4;
                    nC += 2;
                } else {
                    goto tryC;
                }
            }
        }
        if (nC != 0 || poz - 1 != n) {
            goto tryC;
        }
        cout << "1\n";
        continue;
    tryC:
        poz = 1;
        nC = 1;
        while (poz <= n && nC != 0) {
            nC--;
            if (v[poz] == 1) {
                if (v[poz + 1] != 2) {
                    goto fals;
                }
                poz += 3;
            } else if (v[poz] == 2) {
                poz++;
            } else {
                poz++;
                while (poz <= n && v[poz] == 2) {
                    poz++;
                }
                if (poz == n || v[poz] == 3) {
                    goto fals;
                }
                if (poz + 4 <= n && v[poz + 2] == 3) {
                    poz += 4;
                    nC += 2;
                } else {
                    goto fals;
                }
            }
        }
        if (nC != 0 || poz - 1 != n) {
            goto fals;
        }
        cout << "1\n";
        continue;
    fals:
        cout << "0\n";
    }



    return 0;
}