Cod sursa(job #2427023)

Utilizator Ruxandra985Nanu Ruxandra Laura Ruxandra985 Data 30 mai 2019 16:05:00
Problema Pedefe Scor 20
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][VALMAX] , d[2][DIMN][DIMN],aux[2][DIMN][DIMN];
void update (int tip,int p,int val){
    int i;
    for (i = p;i<VALMAX;i = i + ( i & (-i)))
        aib[tip][i] =(aib[tip][i] + val)%MOD;
}
int query (int tip,int p){  /// vrei cu linia mai mica decat l si val < p
    int i;
    int sol = 0;
    if (!p)
        return 0;
    for (i = p;i>0;i = i - ( i & (-i)))
        sol =(sol + aib[tip][i])%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
    s3[0] = -1;
    for (k=0;k<=p;k++){
        //memset (aib[k],0,sizeof(aib[k]));

        for (i=1;i<=n;i++){
            if (k<=1)
                update (0,1,1);
            for (j=1;j<=m;j++){
                x = 0;
                if (s1[i] == s2[j]){

                    if (s1[i] == s3[k]) /// suma d[p][r][k-1] unde s1[p]==s2[r]<=s3[k]
                        x = query ( 1 - (k&1) , s1[i]);
                    else if (s1[i] >= s3[k])
                        x = query ( (k&1) , s1[i]);

                    if (k==p){
                        sol = (sol + x)%MOD;
                    }
                }
                //if (k==2 && x)
                  //  printf ("%d %d %d %d\n",k,i,j,x);
                d[(k&1)][i][j] = x;
                update (1 - (k&1) , s1[i] , aux[1 - (k&1)][i-1][j]);
                update ( (k&1) , s1[i] , aux[(k&1)][i-1][j]);
                /// tocmai ai scapat de j pe linia i, il adaugi pt j ul de pe linia i+1
                aux[1 - (k&1)][i][j] = (aux[1 - (k&1)][i-1][j] + d[1 - (k&1)][i][j])%MOD;

                aux[(k&1)][i][j] = (aux[(k&1)][i-1][j] + d[(k&1)][i][j])%MOD;
            }
            memset (aib[1 - (k&1)],0,sizeof(aib[1 - (k&1)]));
            memset (aib[(k&1)],0,sizeof(aib[(k&1)]));
        }

    }
    fprintf (fout,"%d",sol);
    return 0;
}