#include <stdio.h>
#include <string.h>
#define fin "nextseq.in"
#define fout "nextseq.out"
#define NMAX 10001
int S[NMAX],A[NMAX],B[NMAX],inda[NMAX],indb[NMAX],sol;
FILE * f=fopen(fin,"r"), *g=fopen(fout,"w");
void read(int X[])
{
int i;
for(i=1;i<=X[0];++i)
fscanf(f,"%d",&X[i]);
}
void add_zeroes(int X[],int x) // X < Y
{
memmove(&X[1+x],&X[1],sizeof(int)*X[0]); //mutam X-1 poz
memset(&X[1],0,sizeof(int)*x); //umplem cu 0
X[0] +=x;
}
void readData()
{
fscanf(f,"%d %d %d",&S[0],&A[0],&B[0]);
read(S);
read(A);
read(B);
fclose(f);
}
void qsort(int a[],int st,int dr)
{
int i=st,j=dr,p=a[(st+dr)/2];
while(i<=j)
{
while(a[i]<p) ++i;
while(a[j]>p) --j;
if(i<=j)
{
int aux = a[i] ; a[i] = a[j] ; a[j] = aux;
++i; --j;
}
}
if(st<j) qsort(a,st,j);
if(i<dr) qsort(a,i,dr);
}
int bsearch(int X[],int st,int dr,int x)
{
int step = 1,p = st;
while(2 * step <= dr) step<<=1;
for(;step;step>>=1)
if(p + step <= dr & X[p]<x & X[p+step] <= x)
p+=step;
return p;
}
void get_ind(int X[],int I[])
{
int i;
I[0] = X[0];
for(i=1;i<=X[0];++i)
if(!X[i]) I[i] = 0;
else I[i] = bsearch(S,1,S[0],X[i]);
}
void solve()
{
int equal=0,k=1;
while(!equal)
{
inda[A[0]]++;
for(int i = A[0] ; i>1 ;--i)
if(inda[i]>S[0])
{
inda[i-1]++;
inda[i] = 1;
}
++sol;
while(inda[k]==indb[k]) ++k;
if(k>A[0]) equal=1;
}
--sol;
}
void writeData()
{
fprintf(g,"%d",sol);
fclose(g);
}
int main()
{
readData();
add_zeroes(A,B[0]-A[0]);
qsort(S,1,S[0]);
get_ind(A,inda);
get_ind(B,indb);
solve();
writeData();
return 0;
}