Cod sursa(job #1499732)

Utilizator elevenstrArina Raileanu elevenstr Data 11 octombrie 2015 00:31:20
Problema Perle Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.31 kb
#include <iostream>
#include <fstream>
#include <stack>
using namespace std;
#define MAX 10002
ifstream in("perle.in");
ofstream out("perle.out");
int v[MAX];
stack <int> S;
stack <int> necesar;
int fix[MAX];
int main()
{
    int n,m,i,j,k,lmax,x,t;
    in>>k;
    for(i=1; i<=k; i++)
    {
        in>>lmax;
        for(j=1; j<=lmax; j++)
            in>>v[j];
        if(lmax==1)out<<1<<'\n';
        else
        {
            int l=1;
            int poz=0;
            t=1;
            if(v[1]==2)
            {
                S.push(5);
                l=2;
            }
            if(v[1]==3)
            {
                S.push(6);
                S.push(5);
                l=3;
            }
            if(v[1]==1&&v[3]==3)
            {
                S.push(6);
                l=5;
            }
            if(v[1]==1&&v[3]!=3)
                t=0;

            poz=l;
            if(v[1]==3)poz=2;
           while(!S.empty()&&(l<lmax&&t))
                {
                    x=S.top();
                    S.pop();

                    if(x==5)
                    {   int nt=1;
                        if(v[poz]==2)
                        {
                            ++l;
                            ++poz;
                            S.push(5);
                            nt=0;
                        }
                        if(v[poz]==3&&nt)
                        {  nt=0;
                            t=0;

                        }
                        if(v[poz]==1&&v[poz+2]==3&&nt)
                        {   nt=0;
                            S.push(6);
                            l=l+4;
                            poz+=4;

                        }
                        if(v[poz]==1&&v[poz+2]!=3&&nt&&S.top()!=6)
                            t=0;
                    }
                    int nt=1;
                    if(x==6)
                    {
                        if(v[poz]==3)
                    {
                        S.push(6);
                        S.push(5);
                        poz=poz+1;
                        l=l+2;
                        nt=0;
                    }
                    if(v[poz]==1&&v[poz+1]==2&&nt)
                    {
                        l=l+2;
                        poz=poz+3;
                        nt=0;
                    }
                    if(v[poz]==1&&v[poz+1]!=2&&nt)
                    {
                        t=0;
                        nt=0;
                    }
                    if(v[poz]==2&&nt)
                        ++poz;
                    }

                }
                int imp=0;
                int tor=0;
                int bla=0;
                if(S.empty())bla=1;
                if(!S.empty()&&v[lmax]==2)tor=1;
            while(!S.empty()&&tor)
               {
                   int x=S.top();
                   if(x==6)++imp;
                   else {tor=0; break;}
                   S.pop();
               }
               if(tor&&imp)
                for(int lim=lmax;lim>=lmax-imp+1;lim--)
                if(v[lim]!=2)tor=0;
            if(t&&(bla||tor))out<<1<<'\n';
            else out<<0<<'\n';
            while(!S.empty())
                S.pop();


        }

    }

    return 0;
}