#include <bits/stdc++.h>   using std::bitset;   using std::cin;   using std::cout;   using std::endl;   using std::make_pair;   using std::map;   using std::pair;   using std::priority_queue;   using std::queue;   using std::set;   using std::string;   using std::stringstream;   using std::vector;   class MyTimer {    public:     void reset() {}     void report() {}   } myTimer;   template <typename A, typename B>   std::ostream &operator<<(std::ostream &cout, const pair<A, B> &x) {     return cout <<  (  << x.first <<  ,   << x.second <<  ) ;   }   template <typename T1, typename T2>   inline bool chmin(T1 &a, const T2 &b) {     return a > b ? a = b, true : false;   }   template <typename T1, typename T2>   inline bool chmax(T1 &a, const T2 &b) {     return a < b ? a = b, true : false;   }   const int maxN = 100000 + 233;   int n, m;   int a[maxN], b[maxN], c[maxN], d[maxN], e[maxN];   int ans[maxN];   struct Q {     int t;     int x, y, L, R;     Q(int t, int x, int y, int L, int R) : t(t), x(x), y(y), L(L), R(R) {}     bool operator<(const Q &rhs) const {       return x != rhs.x ? x < rhs.x : y != rhs.y ? y < rhs.y : t > rhs.t;     }   };   vector<Q> q, tmp;   void initialize() {     std::ios::sync_with_stdio(false);     cin >> n >> m;     for (int i = 1; i <= n; ++i) cin >> a[i];     for (int i = 1; i <= n; ++i) cin >> b[i];     for (int i = 1; i <= n; ++i) cin >> c[i];     for (int i = 1; i <= m; ++i) cin >> d[i];     for (int i = 1; i <= m; ++i) cin >> e[i];     for (int i = 1; i <= n; ++i) {       q.emplace_back(i, -c[i] + a[i], c[i] + a[i], a[i], b[i]);     }     for (int i = 1; i <= m; ++i) {       q.emplace_back(-i, -e[i] + d[i], d[i] + e[i], d[i], d[i]);     }     vector<int> t;     for (auto &p : q) t.push_back(p.L), t.push_back(p.R);     std::sort(t.begin(), t.end());     t.erase(std::unique(t.begin(), t.end()), t.end());     for (auto &p : q)       p.L = std::lower_bound(t.begin(), t.end(), p.L) - t.begin() + 1,       p.R = std::lower_bound(t.begin(), t.end(), p.R) - t.begin() + 1;     std::sort(q.begin(), q.end());     tmp.resize(q.size(), Q(0, 0, 0, 0, 0));   }   int C[maxN * 3];   void add(int p, int x) {     p += 2;     for (int i = p; i <= n * 2 + m + 5; i += i & -i) C[i] += x;   }   int sum(int p) {     p += 2;     int r = 0;     for (int i = p; i > 0; i -= i & -i) r += C[i];     return r;   }   void solve(int L, int R) {     if (L >= R) return;     int M = (L + R) >> 1;     solve(L, M);     solve(M + 1, R);     int i = L, j = M + 1, qwq = L;     const auto left = [&](const Q &p) {       tmp[qwq++] = p;       if (p.t > 0) add(p.L, 1), add(p.R + 1, -1);     };     const auto right = [&](const Q &p) {       tmp[qwq++] = p;       if (p.t < 0) ans[-p.t] += sum(p.L);     };     while (i <= M && j <= R) {       if (q[i].y < q[j].y || (q[i].y == q[j].y && q[i].t > 0))         left(q[i++]);       else         right(q[j++]);     }     while (i <= M) left(q[i++]);     while (j <= R) right(q[j++]);     for (int k = L; k <= M; ++k)       if (q[k].t > 0) add(q[k].L, -1), add(q[k].R + 1, 1);     for (int k = L; k <= R; ++k) q[k] = tmp[k];   }   int main() {     initialize();     solve(0, (int)q.size() - 1);     for (int i = 1; i <= m; ++i) printf( %d%c , ans[i],    n [i == m]);     return 0;   }