#include <bits/stdc++.h>
long long dva[200000 + 10];
typedef struct N {
  int l, r, digt;
  long long val;
  void push_up(N a, N b) {
    val = dva[b.digt] * a.val + b.val;
    digt = a.digt + b.digt;
  }
} Node;
Node tree[4 * 200000 + 10];
void build(int l, int r, int k) {
  tree[k].l = l;
  tree[k].r = r;
  tree[k].digt = tree[k].val = 0;
  if (l != r) {
    int mid = (l + r) / 2;
    build(l, mid, 2 * k);
    build(mid + 1, r, 2 * k + 1);
  }
}
void update(int pot, int k, int val) {
  if (tree[k].l == tree[k].r)
    if (!val)
      tree[k].digt = 0, tree[k].val = 0;
    else
      tree[k].digt = 1, tree[k].val = val;
  else {
    int mid = (tree[k].l + tree[k].r) / 2;
    if (mid >= pot)
      update(pot, 2 * k, val);
    else
      update(pot, 2 * k + 1, val);
    tree[k].push_up(tree[2 * k], tree[2 * k + 1]);
  }
}
int pot[200000 + 10];
int main() {
  int n, m;
  while (scanf("%d%d", &n, &m) != EOF) {
    dva[0] = 1;
    for (int i = 1; i <= m; i++) dva[i] = dva[i - 1] * 7;
    long long delta = 0, targ = 0;
    for (int i = 1; i <= n; i++) {
      int t;
      scanf("%d", &t);
      targ = targ * 7 + t;
      delta = delta * 7 + 1;
    }
    for (int i = 1; i <= m; i++) {
      int t;
      scanf("%d", &t);
      pot[t] = i;
    }
    build(1, m, 1);
    for (int i = 1; i < n; i++) update(pot[i], 1, i);
    int cnt = 0;
    for (int i = n; i <= m; i++) {
      if (i > n) update(pot[i - n], 1, 0);
      update(pot[i], 1, i);
      if (targ == tree[1].val) cnt++;
      targ += delta;
    }
    printf("%d\n", cnt);
  }
  return 0;
}
