Cod sursa(job #2036705)

Utilizator ionanghelinaIonut Anghelina ionanghelina Data 10 octombrie 2017 23:18:58
Problema Pedefe Scor 100
Compilator cpp Status done
Runda Lista lui wefgef Marime 2.66 kb
#include<bits/stdc++.h>
#define lsb(i) (i&(-i))
#define MOD 666013
#define dim 1000000
using namespace std;
const int maxVal=500;
int pos=0;
char buff[dim+5];
int AIB[505],s[505],n,m,p,a[505],b[505],c[505],line,sol;
inline void update(int pos,int val)
{
    for(int i=pos;i<=maxVal;i+=lsb(i))
    {
        AIB[i]+=val;
        if(AIB[i]>=MOD) AIB[i]-=MOD;
    }
}
inline void read(int &nr)
{
    nr=0;
    while(buff[pos]<'0' || buff[pos]>'9')
    {
        pos++;
        if(pos==dim)
        {
            pos=0;
            fread(buff,1,dim,stdin);
        }
    }
    while(buff[pos]>='0' && buff[pos]<='9')
    {
        nr=nr*10+buff[pos]-'0';
        pos++;
        if(pos==dim)
        {
            pos=0;
            fread(buff,1,dim,stdin);
        }
    }
}
int dp[3][505][505];
inline int query(int pos)
{
    int q=0;
    for(int i=pos;i>=1;i-=lsb(i))
    {
        q=(q+AIB[i]);
        if(q>=MOD) q-=MOD;
    }
    return q;
}
int main()
{
    freopen("pedefe.in","r",stdin);
    freopen("pedefe.out","w",stdout);
    fread(buff,1,dim,stdin);
//    scanf("%d%d%d",&n,&m,&p);
    read(n);
    read(m);
    read(p);
    for(int i=1;i<=n;i++)
       // scanf("%d",&a[i]);
        read(a[i]);
    for(int i=1;i<=m;i++)
       // scanf("%d",&b[i]);
        read(b[i]);
    for(int i=1;i<=p;i++)
      //  scanf("%d",&c[i]);
        read(c[i]);
    line=0;
    int old=0;
    dp[0][0][0]=1;
    for(int k=0;k<=p;k++,line=old)
    {
        old=1-line;
        memset(s,0,sizeof(s));
        for(int i=1;i<=n;i++)
        {
            memset(AIB,0,sizeof(AIB));
            for(int j=1;j<=m;j++)
            {
                dp[line][i][j]=0;
                if(a[i]==b[j])
                {
                    int x=query(a[i]);
                    if(!k) x++;
                    if(k<p && a[i]==c[k+1])
                    {
                        dp[line][i][j]=(dp[line][i][j]+x);
                        if(dp[line][i][j]>=MOD) dp[line][i][j]-=MOD;
                    }
                        else
                    {
                        dp[old][i][j]=(dp[old][i][j]+x);
                        if(dp[old][i][j]>=MOD) dp[old][i][j]-=MOD;
                    }

                }
                    else dp[old][i][j]=0;
                update(b[j],s[j]);
                s[j]=(s[j]+dp[old][i][j]);
                if(s[j]>=MOD) s[j]-=MOD;
            }
        }
      //  line=line^1;
    }
     sol=0;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
    {
        sol=(sol+dp[line][i][j]);
        if(sol>=MOD) sol-=MOD;
    }
    printf("%d\n",sol);
    return 0;
}