Cod sursa(job #1842612)

Utilizator Alexa2001Alexa Tudose Alexa2001 Data 7 ianuarie 2017 12:27:02
Problema Pedefe Scor 100
Compilator cpp Status done
Runda Lista lui wefgef Marime 1.75 kb
#include <bits/stdc++.h>

using namespace std;

const int Mod = 666013, Nmax = 505;

int dp[2][Nmax][Nmax], i, j, k, p, n, m, A[Nmax], B[Nmax], C[Nmax], xr, sum[Nmax], val;

void add(int &x, int y)
{
    x += y;
    if(x>=Mod) x -= Mod;
}

class AIB
{
    int a[Nmax];
    int ub(int x)
    {
        return (x&(-x));
    }

    public:

        void update(int p, int v)
        {
            for(; p<=500; p+=ub(p))
                add(a[p], v);
        }

        int query(int p)
        {
            int ans = 0;
            for(; p; p-=ub(p))
                ans += a[p];
            return ans % Mod;
        }

        void initialize()
        {
            memset(a, 0, sizeof(a));
        }
} aib;

void read()
{
    int i;
    scanf("%d%d%d", &n, &m, &p);
    for(i=1; i<=n; ++i) scanf("%d", &A[i]);
    for(i=1; i<=m; ++i) scanf("%d", &B[i]);
    for(i=1; i<=p; ++i) scanf("%d", &C[i]);
}

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

    read();

    dp[0][0][0] = 1;

    for(k=xr=0; k<=p; ++k, xr^=1)
    {
        memset(sum, 0, sizeof(sum));
        memset(dp[xr^1], 0, sizeof(dp[xr^1]));

        for(i=1; i<=n; ++i)
        {
            aib.initialize();

            for(j=1; j<=m; ++j)
            {
                if(A[i]==B[j])
                {
                    val = aib.query(A[i]) + (!k);

                    if(k<p && A[i]==C[k+1]) add(dp[xr^1][i][j], val);
                    else add(dp[xr][i][j], val);
                }

                aib.update(B[j], sum[j]);
                add(sum[j], dp[xr][i][j]);
            }
        }
    }

    long long ans = 0;
        for(i=1; i<=n; ++i)
            for(j=1; j<=m; ++j)
                ans += dp[xr^1][i][j];
    printf("%lld\n", ans%Mod);

    return 0;
}