Cod sursa(job #2426880)

Utilizator Ruxandra985Nanu Ruxandra Laura Ruxandra985 Data 29 mai 2019 20:12:22
Problema Pedefe Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.33 kb
#include <cstdio>
#include <cstring>
#define MOD 666013
#define DIMN 510
#define VALMAX 510
using namespace std;
int s1[DIMN],s2[DIMN],s3[DIMN];
int aib[2][DIMN][VALMAX] , d[2][DIMN][DIMN];
void update (int tip,int l,int p,int val){
    int i,j;
    for (i = l;i<VALMAX;i = i + ( i & (-i)))
        for (j = p;j<VALMAX;j = j + ( j & (-j)))
            aib[tip][i][j] =(aib[tip][i][j] + val)%MOD;
}
int query (int tip,int l,int p){  /// vrei cu linia mai mica decat l si val < p
    int i,j;
    int sol = 0;
    if (!l)
        return 0;
    for (i = l;i>0;i = i - ( i & (-i)))
        for (j = p;j>0;j = j - ( j & (-j)))
            sol =(sol + aib[tip][i][j])%MOD;
    return sol;
}
int main()
{
    FILE *fin=fopen ("pedefe.in","r");
    FILE *fout=fopen ("pedefe.out","w");
    int n,m,p,i,j,k,sol=0,x;
    fscanf (fin,"%d%d%d",&n,&m,&p);
    for (i=1;i<=n;i++)
        fscanf (fin,"%d",&s1[i]);
    for (i=1;i<=m;i++)
        fscanf (fin,"%d",&s2[i]);
    for (i=1;i<=p;i++)
        fscanf (fin,"%d",&s3[i]);
    /// d[i][j][k] = nr de solutii daca ai 1..i din s1 , 1..j din s2 , si 1..k din s3
    d[0][0][0] = 1;
    for (k=1;k<=p;k++){
        //memset (aib[k],0,sizeof(aib[k]));
        for (i=0;i<=1;i++)
            for (j=0;j<=m;j++)
                memset (aib[i][j],0,sizeof(aib[i][j]));
        if (k==1)
            update (0,1,1,1);
        aib[0][0][0] = 1;
        for (i=1;i<=n;i++){
            for (j=1;j<=m;j++){
                if (s1[i] == s2[j]){
                    //if (k==1 && i==4 && j==5)
                      //  printf ("a");
                    x = 0;
                    if (s1[i] == s3[k]) /// suma d[p][r][k-1] unde s1[p]==s2[r]<=s3[k]
                        x = query ( 0 , j-1 , s1[i]);
                    else if (s1[i] >= s3[k])
                        x = query (1 , j-1 , s1[i]);
                    d[k%2][i][j] = x;


                    //if (k==1)
                      //  printf ("%d %d %d %d\n",i,j,k,x);
                    if (k==p){
                        sol = (sol + x)%MOD;
                    }
                }
            }
            for (j=1;j<=m;j++){
                update ( 1 , j ,s1[i] , d[k%2][i][j]);
                update ( 0 , j , s1[i] , d[1-k%2][i][j]);
            }
        }
    }
    fprintf (fout,"%d",sol);
    return 0;
}