#include<stdio.h>
#include<algorithm>
using namespace std;
int z[20000];
int num[20000];
int a,b;
pair<int,int> dfs(int d,int l,int r){
	int L=upper_bound(z,z+b+1,l)-z-1;
	int R=upper_bound(z,z+b+1,r)-z-1;
	//printf("%d %d %d: %d %d\n",d,l,r,L,R);
	if(l==r){
		return make_pair(0,1<<num[L]);
	}
	if(L==R){
		if(num[L]<=d){
			return make_pair(r-l,1<<num[L]);
		}
		int ad=0;
		for(int i=0;i<=d;i++)ad+=(1<<i);
	//	printf("%d %d %d: %d %d %d\n",d,l,r,num[L],(r-l+1)-(r-l+1)/(1<<(1+a-num[L])),ad);
		return make_pair((r-l+1)-(r-l+1)/(1<<(1+a-num[L])),ad);
	}
	pair<int,int>lv=dfs(d+1,l,(l+r)/2);
	pair<int,int>rv=dfs(d+1,(l+r)/2+1,r);
	int can=0;
	if(lv.second&(1<<(d+1))){
		can|=rv.second;
	}
	if(rv.second&(1<<(d+1))){
		can|=lv.second;
	}
	if(can&(1<<(d+1)))can-=(1<<(d+1));
	if(can){
	//	printf("%d %d %d: %d %d\n",d,l,r,lv.first+rv.first,can);
		return make_pair(lv.first+rv.first,can);
	}
	int ad=lv.second|rv.second;
	for(int i=d+1;i<=a;i++)if(ad&(1<<i))ad-=(1<<i);
	if(ad){
		//printf("%d %d %d: %d %d\n",d,l,r,lv.first+rv.first+1,ad);
		return make_pair(lv.first+rv.first+1,ad);
	}
	ad=0;
	for(int i=0;i<=d;i++)ad+=(1<<i);
//	printf("%d %d %d: %d %d\n",d,l,r,lv.first+rv.first+2,ad);
	return make_pair(lv.first+rv.first+1,ad);
}
int main(){
	scanf("%d%d",&a,&b);
	for(int i=0;i<b+1;i++){
		scanf("%d",z+i);
	}
	for(int i=0;i<b;i++)scanf("%d",num+i);
	/*for(int i=0;i<=a;i++){
		int len=1<<(a-i);
		for(int j=0;j<=a;j++){
			
		}
	}*/
	printf("%d\n",dfs(0,0,(1<<a)-1).first);
}