Cod sursa(job #2619051)

Utilizator CraniXortDumitrescul Eduard CraniXort Data 26 mai 2020 20:20:46
Problema Pedefe Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.18 kb
#include <bits/stdc++.h>
#define maxn 505
#define mod 666013
std::ifstream fin ("pedefe.in");
std::ofstream fout ("pedefe.out");

int x1[maxn];
int x2[maxn];
int x3[maxn];

long long dp[2][maxn][maxn];
long long sum[2][maxn][maxn];
long long bit[2][maxn][maxn];
long long new_sum[maxn];

void update (long long *arr, int pos, long long val){
    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, dp[0][i][0]);
        update (bit[1][0], 0, dp[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], 0, sum[0][i][j]);
            update (bit[1][j], 0, 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] += 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];
                        }
                    }
                    */
                }
                if (x1[i] == x2[j] and x1[i] != x3[k]){

                    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];
                        }
                    }
                    */
                }
                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];
            }
            for (j=1; j<=n2; j++){
                update (bit[1][j], x1[i], sum[1][i][j]);
                update (bit[0][j], x1[i], sum[0][i][j]);
            }
        }


        for (j=0; j<=n2; j++)
        for (i=0; i<maxn; i++)
            bit[0][j][i] = bit[1][j][i] = 0;

        for (i=0; i<=n1; i++)
        for (j=0; j<=n2; j++){
            dp[1][i][j] = dp[0][i][j];
            dp[0][i][j] = 0;
        }
        /*
        for (i=1; i<=n1; i++, fout << '\n')
            for (j=1; j<=n2; j++)
            fout << dp[1][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;
}