Cod sursa(job #3358013)

Utilizator IvanAndreiIvan Andrei IvanAndrei Data 13 iunie 2026 22:57:35
Problema Pedefe Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.36 kb
// Pregatire Examen PA 2026
// Ziua 2
#include <bits/stdc++.h>

using namespace std; 

const int max_size = 5e2 + 5, mod = 666013;

#define lsb(x)(x & -(x))

int s1[max_size], s2[max_size], s3[max_size], dp[2][max_size][max_size], aib[max_size], sum[max_size];

void upd (int pos, int val)
{
    for (int i = pos; i < max_size; i += lsb(i))
    {
        aib[i] += val;
        if (aib[i] >= mod)
        {
            aib[i] -= mod;
        }
    }
}

int query (int pos)
{
    int ans = 0;
    for (int i = pos; i > 0; i -= lsb(i))
    {
        ans += aib[i];
        if (ans >= mod)
        {
            ans -= mod;
        }
    }
    return ans;
}

void solve ()
{
    int n, m, p;
    cin >> n >> m >> p;
    for (int i = 1; i <= n; i++)
    {
        cin >> s1[i];
    }
    for (int i = 1; i <= m; i++)
    {
        cin >> s2[i];
    }
    for (int i = 1; i <= p; i++)
    {
        cin >> s3[i];
    }
    dp[0][0][0] = 1;
    for (int k = 0; k <= p; k++)
    {
        int curr = k & 1, nxt = curr ^ 1;
        for (int i = 1; i <= n; i++)
        {
            for (int j = 1; j <= m; j++)
            {
                dp[nxt][i][j] = 0;
            }
        }
        for (int j = 0; j <= max_size; j++)
        {
            aib[j] = 0;
            sum[j] = 0;
        }
        for (int i = 1; i <= n; i++)
        {
            for (int j = 0; j < max_size; j++)
            {
                aib[j] = 0;
            }
            for (int j = 1; j <= m; j++)
            {
                if (s1[i] == s2[j])
                {
                    if (s1[i] == s3[k + 1])
                    {
                        dp[nxt][i][j] += query(s1[i]);
                        if (k == 0)
                        {
                            dp[nxt][i][j]++;
                        }
                        if (dp[nxt][i][j] >= mod)
                        {
                            dp[nxt][i][j] -= mod;
                        }
                    }
                    else
                    {
                        dp[curr][i][j] += query(s1[i]);
                        if (k == 0)
                        {
                            dp[curr][i][j]++;
                        }
                        if (dp[curr][i][j] >= mod)
                        {
                            dp[curr][i][j] -= mod;
                        }
                    }
                }
                upd(s2[j], sum[j]);
                sum[j] += dp[curr][i][j];
                if (sum[j] >= mod)
                {
                    sum[j] -= mod;
                }
            }
        }
    }
    int ans = 0, nc = p & 1;
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= m; j++)
        {
            ans += dp[nc][i][j];
            if (ans >= mod)
            {
                ans -= mod;
            }
        }
    }
    cout << ans << '\n';
}

signed main() 
{ 
#ifdef LOCAL 
    freopen("test.in", "r", stdin); 
    freopen("test.out", "w", stdout);
#else
    freopen("pedefe.in", "r", stdin);
    freopen("pedefe.out", "w", stdout);
#endif // LOCAL 
    ios_base::sync_with_stdio(false); 
    cin.tie(0); 
    cout.tie(0); 
    long long tt; 
    tt = 1;
    //cin >> tt;
    while (tt--)
    {
        solve();
    }
    return 0; 
}