Cod sursa(job #1327232)

Utilizator andrei.arnautuAndi Arnautu andrei.arnautu Data 26 ianuarie 2015 14:43:46
Problema NextSeq Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <cstdio>
#include <algorithm>
using namespace std;

FILE *fin=freopen("nextseq.in","r",stdin);
FILE *fout=freopen("nextseq.out","w",stdout);

int n, m, p;
int Pos[10003], V[10003], A[10003], B[10003];

void Read()
{
    int i, x;
    scanf("%d %d %d", &n, &m, &p);
    for(i = 1; i <= n ; ++i)
        scanf("%d", &V[i]);
    sort(V + 1, V + n + 1);
    for(i = 1; i <= n ; ++i)
        Pos[V[i]] = i;

    A[0] = m;

    for(i = 1; i <= m ; ++i)
    {
        scanf("%d", &x);
        A[i] = Pos[x];
    }

    B[0] = p;

    for(i = 1; i <= p ; ++i)
    {
        scanf("%d", &x);
        B[i] = Pos[x];
    }

}

inline bool egal()
{
    if( A[0] < B[0] )
        return 0;
    for(int i = 1; i <= A[0]; ++i)
        if( A[i] < B[i] )
            return 0;
    return 1;
}

inline void Raise()
{
    int i;

    for(i = 1; i <= A[0]; ++i)
    {
        if( A[i] < n )
        {
            ++A[i];
            return;
        }
        else
        {
            A[i] = 1;
            ++A[i + 1];
            if(i == A[0])
                ++A[0];
        }
    }
}

void Solve()
{
    int i, cnt = -1;

    reverse(A + 1, A + A[0] + 1);
    reverse(B + 1, B + B[0] + 1);

    while(!egal())
    {
        ++cnt;
        Raise();
    }
    printf("%d", cnt);
}

int main()
{
    Read();
    Solve();
    return 0;
}