Pagini recente » Cod sursa (job #1140070) | Cod sursa (job #2303694) | Cod sursa (job #1743897) | Cod sursa (job #3155732) | Cod sursa (job #75233)
Cod sursa(job #75233)
#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;
}