Pagini recente » Cod sursa (job #2047268) | Cod sursa (job #2386742) | Cod sursa (job #242066) | Cod sursa (job #2465792) | Cod sursa (job #2619216)
#include <bits/stdc++.h>
#define maxn 505
#define mod 666013
std::ifstream fin ("pedefe.in");
std::ofstream fout ("pedefe.out");
long long x1[maxn];
long long x2[maxn];
long long x3[maxn];
long long dp[2][maxn][maxn];
long long sum[2][maxn][maxn];
long long bit[2][maxn][maxn];
void update (long long *arr, int pos, long long val){
if (val == 0)
return;
while (pos < maxn){
arr[pos] += val;
pos = (pos | (pos+1));
}
}
long long query (long long *arr, int pos){
long long ans = 0;
while (pos >= 0){
ans += arr[pos];
pos = (pos & (pos+1)) - 1;
}
return ans;
}
int main(){
int n1, n2, n3, i, j ,k, ii, jj, kk;
fin >> n1 >> n2 >> n3;
for (i=1; i<=n1; i++)
fin >> x1[i];
for (i=1; i<=n2; i++)
fin >> x2[i];
for (i=1; i<=n3; i++)
fin >> x3[i];
dp[0][0][0] = 1;
for (k=0; k<=n3; k++){
i=0;
sum[0][i][0] = dp[0][i][0];
//sum[1][i][0] = dp[1][i][0];
update (bit[0][0], 0, sum[0][i][0]);
update (bit[1][0], 0, sum[1][i][0]);
for (j=1; j<=n2; j++){
sum[0][i][j] = sum[0][i][j-1] + dp[0][i][j];
//sum[1][i][j] = sum[1][i][j-1] + dp[1][i][j];
update (bit[0][j], x1[i], sum[0][i][j]);
update (bit[1][j], x1[i], sum[1][i][j]);
}
for (i=1; i<=n1; i++){
sum[0][i][0] = dp[0][i][0];
//sum[1][i][0] = dp[1][i][0];
for (j=1; j<=n2; j++){
if (x1[i] == x2[j] and x2[j] == x3[k] and k){
dp[0][i][j] = (dp[0][i][j] + query (bit[1][j-1], x1[i]));
/*
for (ii=0; ii<i; ii++){
if (x1[ii] <= x1[i]){
dp[0][i][j] += sum[1][ii][j-1];
for (jj=0; jj<j; jj++){
dp[0][i][j] += dp[1][ii][jj];
}
}
}
*/
}
if (x1[i] == x2[j] and x1[i] != x3[k]){
dp[0][i][j] = (dp[0][i][j] + query (bit[0][j-1], x1[i]));
/*
for (ii=0; ii<i; ii++){
if (x1[ii] <= x1[i]){
dp[0][i][j] += sum[0][ii][j-1];
for (jj=0; jj<j; jj++){
dp[0][i][j] += dp[0][ii][jj];
}
}
}
*/
}
//sum[1][i][j] = sum[1][i][j-1] + dp[1][i][j];
sum[0][i][j] = sum[0][i][j-1] + dp[0][i][j];
//update (bit[0][j], x1[i], sum[0][i][j]);
}
for (j=1; j<=n2; j++){
update (bit[0][j], x1[i], sum[0][i][j]);
update (bit[1][j], x1[i], sum[1][i][j]);
}
}
/*
for (j=1; j<=n2; j++, fout << '\n')
for (i=0; i<=10; i++)
fout << bit[0][j][i] << ' ';
fout << '\n';
for (j=1; j<=n2; j++, fout << '\n')
for (i=0; i<=10; i++)
fout << bit[1][j][i] << ' ';
fout << "********\n";
*/
for (i=0; i<=n1; i++)
for (j=0; j<=n2; j++){
sum[1][i][j] = sum[0][i][j];
dp[1][i][j] = dp[0][i][j];
dp[0][i][j] = 0;
}
for (i=0; i<=maxn; i++)
for (j=0; j<=n2; j++){
//bit[1][j][i] = bit[0][j][i];
bit[1][j][i] = 0;
bit[0][j][i] = 0;
}
/*
for (i=1; i<=n1; i++, fout << '\n')
for (j=1; j<=n2; j++)
fout << dp[1][i][j] << ' ';
fout << "**********\n";
*/
}
/*
for (k=1; k<=n3; k++){
for (i=1; i<=n1; i++, fout << '\n')
for (j=1; j<=n2; j++)
fout << dp[k][i][j] << ' ';
fout << "**********\n";
}
*/
long long ans = 0;
for (i=1; i<=n1; i++)
for (j=1; j<=n2; j++)
ans = ans + dp[1][i][j];
fout << ans % mod << '\n';
return 0;
}