Pagini recente » Cod sursa (job #2138127) | Cod sursa (job #536344) | Cod sursa (job #2891703) | Cod sursa (job #2929149) | Cod sursa (job #2938027)
/// Preset de infoarena
#include <fstream>
#include <iostream>
using namespace std;
ifstream fin("pedefe.in");
ofstream fout("pedefe.out");
const int maxN = 505, mod = 666013;
int n, m, p, ans, s1[maxN], s2[maxN], s3[maxN], aib[maxN], dp[2][maxN][maxN], sum[maxN];
void update(int poz, int val)
{
for(int i = poz; i <= 500; i += (i & (-i)))
aib[i] = (aib[i] + val) % mod;
}
int query(int poz)
{
int aux = 0;
for(int i = poz; i >= 1; i -= (i & (-i)))
aux = (aux + aib[i]) % mod;
return aux;
}
int main()
{
fin >> n >> m >> p;
for(int i = 1; i <= n; i++)
fin >> s1[i];
for(int i = 1; i <= m; i++)
fin >> s2[i];
for(int i = 1; i <= p; i++)
fin >> s3[i];
dp[0][0][0] = 1;
for(int k = 0; k <= p; k++)
{
int ck = (k + 1) % 2, nk = k % 2;
for(int i = 0; i < maxN; i++)
{
sum[i] = 0;
for(int j = 0; j < maxN; j++)
dp[nk][i][j] = 0;
}
for(int i = 1; i <= n; i++)
{
for(int j = 0; j < maxN; j++)
aib[j] = 0;
for(int j = 1; j <= m; j++)
{
if(s1[i] == s2[j])
{
if(s1[i] == s3[k + 1])
dp[nk][i][j] = (dp[nk][i][j] + query (s1[i]) + (k == 0)) % mod;
else
dp[ck][i][j] = (dp[ck][i][j] + query (s1[i]) + (k == 0)) % mod;
}
update(s2[j], sum[j]);
sum[j] = (sum[j] + dp[ck][i][j]) % mod;
}
}
}
int ind = (p + 1) % 2;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++)
ans = (ans + dp[ind][i][j]) % mod;
fout << ans;
return 0;
}