Cod sursa(job #3356296)

Utilizator Anul2024Anul2024 Anul2024 Data 30 mai 2026 17:40:16
Problema Pedefe Scor 55
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.42 kb
#include <fstream>
using namespace std;
ifstream fin ("pedefe.in");
ofstream fout ("pedefe.out");
const int DIM = 500, MOD = 666013;
int n[3], maxval, dp[2][DIM + 1][DIM + 1], v[3][DIM + 1];
void add (int &x, int y)
{
    x += y;
    if (x >= MOD)
        x -= MOD;
    if (x < 0)
        x += MOD;
}
struct AIB
{
    int v[DIM + 1];
    void update (int pos, int val)
    {
        for (int i = pos; i <= maxval; i += (i & -i))
        {
            add (v[i], val);
        }
    }
    int query (int pos)
    {
        int sol = 0;
        for (int i = pos; i > 0; i -= (i & -i))
        {
            add (sol, v[i]);
        }
        return sol;
    }
};
AIB aib[2];
void read ()
{
    fin >> n[0] >> n[1] >> n[2];
    for (int i = 0; i < 3; i++)
    {
        for (int j = 1; j <= n[i]; j++)
        {
            fin >> v[i][j];
            maxval = max (maxval, v[i][j]);
        }
    }
}
void solve ()
{
    for (int p = 0; p <= n[2]; p++)
    {
        int k = (p & 1);
        for (int i = 1; i <= n[0]; i++)
        {
            for (int j = 1; j <= n[1]; j++)
            {
                if (p == 3 && i == 5 && j == 5)
                    int o = 1;
                if (p == 3 && i == 4 && j == 4)
                    int o = 1;
                dp[k][i][j] = 0;
                if (v[0][i] == v[1][j])
                {
                    if (v[0][i] == v[2][p])
                        add (dp[k][i][j], aib[1 - k].query (v[0][i]));
                    add (dp[k][i][j], aib[k].query (v[0][i]));
                    if ((p == 0 && v[0][i] != v[2][p + 1]) || (p == 1 && v[0][i] == v[2][p]))
                        add (dp[k][i][j], 1);
                }
                //fout << p << " " << i << " " << j << " " << dp[k][i][j] << "\n";
                add (dp[k][i][j], dp[k][i - 1][j]);
                aib[k].update (v[1][j], dp[k][i - 1][j]);
                aib[1 - k].update (v[1][j], dp[1 - k][i - 1][j]);
            }
            for (int j = 1; j <= n[1]; j++)
            {
                aib[k].update (v[1][j], -dp[k][i - 1][j]);
                aib[1 - k].update (v[1][j], -dp[1 - k][i - 1][j]);
            }
        }
    }
}
void print ()
{
    int k = (n[2] & 1), sol = 0;
    for (int j = 1; j <= n[1]; j++)
    {
        add (sol, dp[k][n[0]][j]);
    }
    fout << sol;
}
int main()
{
    read ();
    solve ();
    print ();
    return 0;
}