Pagini recente » Cod sursa (job #3309482) | Cod sursa (job #2176755) | Cod sursa (job #3349469) | Cod sursa (job #2895344) | Cod sursa (job #3356299)
#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++)
{
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]));
if (!(p < n[2] && v[0][i] == v[2][p + 1]))
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;
}