Pagini recente » Cod sursa (job #2240368) | Cod sursa (job #521206) | Cod sursa (job #3312499) | Borderou de evaluare (job #3357687) | Cod sursa (job #3358013)
// 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;
}