Cod sursa(job #75233)

Utilizator sealTudose Vlad seal Data 31 iulie 2007 15:07:07
Problema Pedefe Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.74 kb
#include<stdio.h>
#include<string.h>
#define Nm 501
#define Mod 666013
int S1[Nm],S2[Nm],S3[Nm],n,m,p,ans;

void read()
{
    int i;

    freopen("pedefe.in","r",stdin);
    scanf("%d%d%d",&n,&m,&p);
    for(i=1;i<=n;++i)
        scanf("%d",S1+i);
    for(i=1;i<=m;++i)
        scanf("%d",S2+i);
    for(i=1;i<=p;++i)
        scanf("%d",S3+i);
}

void update(int A[], int i, int v)
{
    for(;i<Nm;i+=i&(i-1)^i)
    {
        A[i]+=v;
        if(A[i]>=Mod)
            A[i]-=Mod;
    }
}

int query(int A[], int i)
{
    int ans=0;

    for(;i;i-=i&(i-1)^i)
    {
        ans+=A[i];
        if(ans>=Mod)
            ans-=Mod;
    }
    return ans;
}

void solve()
{
    int M[2][Nm][Nm],V[2][Nm],Aib[2][Nm],i,j,k,p1,p2;

    S3[p+1]=Nm; p2=0; p1=1;
    for(k=0;k<=p;++k)
    {
        memset(V[0],0,sizeof(V[0]));
        memset(V[1],0,sizeof(V[1]));
        for(i=1;i<=n;++i)
        {
            memset(Aib[0],0,sizeof(Aib[0]));
            memset(Aib[1],0,sizeof(Aib[1]));
            for(j=1;j<=m;++j)
            {
                if(S1[i]==S2[j] && S1[i]>=S3[k] && S1[i]<=S3[k+1])
                    if(S1[i]==S3[k])
                    {
                        M[p2][i][j]=query(Aib[p1],S1[i]);
                        if(k==1)
                        {
                            ++M[p2][i][j];
                            if(M[p2][i][j]==Mod)
                                M[p2][i][j]-=Mod;
                        }
                    }
                    else
                    {
                        M[p2][i][j]=query(Aib[p2],S1[i]);
                        if(!k)
                        {
                            ++M[p2][i][j];
                            if(M[p2][i][j]==Mod)
                                M[p2][i][j]-=Mod;
                        }
                    }
                else
                    M[p2][i][j]=0;
                if(k)
                    update(Aib[p1],S2[j],V[p1][j]);
                update(Aib[p2],S2[j],V[p2][j]);
            }
            for(j=1;j<=m;++j)
            {
                if(k)
                {
                    V[p1][j]+=M[p1][i][j];
                    if(V[p1][j]>=Mod)
                        V[p1][j]-=Mod;
                }
                V[p2][j]+=M[p2][i][j];
                if(V[p2][j]>=Mod)
                    V[p2][j]-=Mod;
            }
        }
        p1^=1; p2^=1;
    }

    for(i=1;i<=n;++i)
        for(j=1;j<=m;++j)
        {
            ans+=M[p1][i][j];
            if(ans>=Mod)
                ans-=Mod;
        }
}

void write()
{
    freopen("pedefe.out","w",stdout);
    printf("%d\n",ans);
}

int main()
{
    read();
    solve();
    write();
    return 0;
}