Cod sursa(job #2036701)

Utilizator ionanghelinaIonut Anghelina ionanghelina Data 10 octombrie 2017 23:13:36
Problema Pedefe Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.82 kb
#include<bits/stdc++.h>
#define lsb(i) (i&(-i))
#define MOD 666013
using namespace std;
const int maxVal=500;
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;
        AIB[i]%=MOD;
    }
}
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])%MOD;
    }
    return q;
}
int main()
{
    freopen("pedefe.in","r",stdin);
    freopen("pedefe.out","w",stdout);
    scanf("%d%d%d",&n,&m,&p);
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    for(int i=1;i<=m;i++)
        scanf("%d",&b[i]);
    for(int i=1;i<=p;i++)
        scanf("%d",&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)%MOD;
                    }
                        else
                    {
                        dp[old][i][j]=(dp[old][i][j]+x)%MOD;
                    }

                }
                    else dp[old][i][j]=0;
                update(b[j],s[j]);
                s[j]=(s[j]+dp[old][i][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])%MOD;
    }
    printf("%d\n",sol);
    return 0;
}