#include<cstdio>
#include<algorithm>
#include<map>
#define ull unsigned long long
#define N 414514
using namespace std;
int seed,md=19260817;
int _rand(){seed=(seed*7%md+13)%md;return seed;}
void _srand(int x){seed=x;}
int n,m,ans;
int a[N],b[N];
ull base=131,h[N],ha[N],sum;
int rt;
bool tag[N];
map<ull,bool>mp;
pair<ull,int> fi[N];
struct fhq_treap{
int rnd[N],siz[N],tot,ch[N][2];
ull val[N],key[N];
#define lc ch[x][0]
#define rc ch[x][1]
int newnode(ull v){
int x=++tot;
val[x]=key[x]=v;siz[x]=1;
rnd[x]=_rand();
return x;
}
int pushup(int x){
siz[x]=siz[lc]+siz[rc]+1;
key[x]=key[lc]*h[siz[rc]+1]+val[x]*h[siz[rc]]+key[rc];
return x;
}
void split(int p,int k,int &x,int &y){
if(!p)return void(x=y=0);
if(k>siz[ch[p][0]])split(ch[x=p][1],k-siz[ch[p][0]]-1,ch[p][1],y);
else split(ch[y=p][0],k,x,ch[p][0]);
pushup(p);
}
int merge(int x,int y){
if(!x||!y)return x+y;
if(rnd[x]<rnd[y]){rc=merge(rc,y);return pushup(x);}
else{ch[y][0]=merge(x,ch[y][0]);return pushup(y);}
}
}t;
signed main(){
_srand(676767);
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
for(int i=1;i<=m;i++)scanf("%d",&b[i]),fi[i]={1ull*b[i],i};
for(int i=1;i<=m;i++)if(b[i]<=n)tag[i]=b[i];
if(m<n)return puts("0"),0;
sum=h[0]=1;
for(int i=1;i<=m;i++)h[i]=h[i-1]*base,sum+=i<=n?h[i]:0;
for(int i=1;i<=n;i++)ha[i]=ha[i-1]*base+a[i];
for(int i=0;i<=m-n;i++)mp[ha[n]+sum*i]=1;
for(int i=1;i<=m;i++)if(tag[i])rt=t.merge(rt,t.newnode(1ull*b[i]));
sort(fi+1,fi+m+1);
for(int i=1;i<=m-n;i++){
if(mp[t.key[rt]])ans++;
int a,b,c,val=fi[i].second;
t.split(rt,val-1,a,b);
t.split(b,1,b,c);
rt=t.merge(a,c);
val=fi[i+n].second;
t.split(rt,val-1,a,b);
rt=t.merge(a,t.merge(t.newnode(fi[i+n].first),b));
}
if(mp[t.key[rt]])ans++;
printf("%d\n",ans);
return 0;
}