Pagini recente » Cod sursa (job #101806) | Cod sursa (job #3229137) | Cod sursa (job #1492677) | Cod sursa (job #1421535) | Cod sursa (job #1769480)
#include <iostream>
#include <cstdio>
#include <cstring>
#define MAXN 550
#define MAXP 110
#define MOD 666013
using namespace std;
int n, m, p;
int s1[MAXN], s2[MAXN], s3[MAXP];
int aib[MAXN];
void citire()
{
scanf("%d %d %d", &n, &m, &p);
for (int i = 1; i <= n; i++)
scanf("%d", &s1[i]);
for (int i = 1; i <= m; i++)
scanf("%d", &s2[i]);
for (int i = 1; i <= p; i++)
scanf("%d", &s3[i]);
}
int a[2][MAXN][MAXN];
int sum[MAXN];
int modSum(int e, int f)
{
int r = e+f;
if (r >= MOD) r -= MOD;
return r;
}
inline int zero(int x)
{
return x & -x;
}
void update(int ind, int val)
{
for (int i = ind; i < MAXN; i += zero(i))
aib[i] = modSum(aib[i], val);
}
int query(int ind)
{
int to = 0;
for (int i = ind; i > 0; i -= zero(i))
to = modSum(to, aib[i]);
return to;
}
void solve()
{
int crt = 1;
for (int k = 0; k <= p; k++)
{
crt ^= 1;
memset(sum, 0, sizeof sum);
for (int i = 1; i <= n; i++) {
memset(aib, 0, sizeof aib);
if (k == 0)
update(1, 1);
for (int j = 1; j <= m; j++) {
a[!crt][i][j] = 0;
if (s1[i] == s2[j]) {
int val = query(s1[i]);
if (k == p || s3[k+1] != s1[i])
a[crt][i][j] += val;
else
a[!crt][i][j] = val;
}
else
a[crt][i][j] = 0;
update(s2[j], sum[j]);
sum[j] = modSum(sum[j], a[crt][i][j]);
}
}
}
int rez = 0;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
rez = modSum(rez, a[crt][i][j]);
printf("%d", rez);
}
int main()
{
freopen("pedefe.in", "r", stdin);
freopen("pedefe.out", "w", stdout);
citire();
solve();
return 0;
}