Pagini recente » Profil TpgTpg | Istoria paginii utilizator/lucianb95 | Profil Alinutzzz | Istoria paginii utilizator/diriczizsolt | Cod sursa (job #2036701)
#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;
}