#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; using namespace atcoder; typedef long long ll; #define rep(i, n) for (int i = 0; i < (int)(n); i++) #define repr(i, n) for (int i = (int)(n) - 1; i >= 0; i--) #define repk(i, k, n) for (int i = k; i < (int)(n); i++) #define all(v) v.begin(), v.end() #define mod1 1000000007 #define mod2 998244353 #define mod3 100000007 #define vi vector #define vs vector #define vc vector #define vl vector #define vb vector #define vvi vector> #define vvc vector> #define vvl vector> #define vvb vector> #define vvvi vector>> #define vvvl vector>> #define pii pair #define pil pair #define pli pair #define pll pair #define vpii vector> #define vpll vector> #define vvpii vector>> #define vvpll vector>> template void debug(T e) { cerr << e << endl; } template void debug(vector &v) { rep(i, v.size()) { cerr << v[i] << " "; } cerr << endl; } template void debug(vector> &v) { rep(i, v.size()) { rep(j, v[i].size()) { cerr << v[i][j] << " "; } cerr << endl; } } template void debug(vector> &v) { rep(i, v.size()) { cerr << v[i].first << " " << v[i].second << endl; } } template void debug(set &st) { for (auto itr = st.begin(); itr != st.end(); itr++) { cerr << *itr << " "; } cerr << endl; } template void debug(multiset &ms) { for (auto itr = ms.begin(); itr != ms.end(); itr++) { cerr << *itr << " "; } cerr << endl; } template void debug(map &mp) { for (auto itr = mp.begin(); itr != mp.end(); itr++) { cerr << itr->first << " " << itr->second << endl; } } void debug_out() { cerr << endl; } template void debug_out(Head H, Tail... T) { cerr << H << " "; debug_out(T...); } using mint = modint1000000007; void debug_mint1(vector &vec) { for (int i = 0; i < vec.size(); i++) { cerr << vec[i].val() << " "; } cerr << endl; } void debug_mint2(vector> &vec) { for (int i = 0; i < vec.size(); i++) { for (int j = 0; j < vec[i].size(); j++) { cerr << vec[i][j].val() << " "; } cerr << endl; } } ll op(ll a, ll b){ return a + b; } ll e(){ return 0LL; } int main() { ll N, Q; cin >> N >> Q; vector A(N); vector B(N); rep(i, N){ cin >> A[i]; } rep(i, N) cin >> B[i]; vector l(Q); vector d(Q); vector r(Q); vector u(Q); for (ll i = 0; i < Q; i++){ cin >> l[i] >> d[i] >> r[i] >> u[i]; l[i]--; d[i]--; r[i]--; u[i]--; } ll L = 0; rep(i, N){ L = max(L, A[i]); L = max(L, B[i]); } L++; vector vecs(L + 1, -1); map mp; rep(i, N){ mp[A[i]]++; mp[B[i]]++; } ll now = 0; for (auto it = mp.begin(); it != mp.end(); it++){ vecs[it->first] = now; now++; } segtree segh1(L); segtree segh2(L); segtree segw1(L); segtree segw2(L); ll now_h = -1; ll now_w = -1; ll b = 700; vector ans(Q, 0); vector>> qs(N / b + 1, vector>(0)); for (ll i = 0; i < Q; i++){ if (l[i] > 0){ if (d[i] > 0) qs[(l[i] - 1) / b].push_back(make_pair(d[i] - 1, make_pair(i * 2 + 1, l[i] - 1))); qs[(l[i] - 1) / b].push_back(make_pair(u[i], make_pair(i * 2, l[i] - 1))); } if (d[i] > 0) qs[r[i] / b].push_back(make_pair(d[i] - 1, make_pair(i * 2, r[i]))); qs[r[i] / b].push_back(make_pair(u[i], make_pair(i * 2 + 1, r[i]))); } for (ll i = 0; i <= N / b; i++){ sort(all(qs[i])); if (i % 2 == 1) reverse(all(qs[i])); } ll now_ans = 0; for (ll i = 0; i <= N / b; i++){ for (ll j = 0; j < qs[i].size(); j++){ ll id = qs[i][j].second.first / 2; ll sign = qs[i][j].second.first % 2; ll new_h = qs[i][j].second.second; ll new_w = qs[i][j].first; // debug_out(new_h, new_w, id, sign); // 処理 if (now_h < new_h){ for (ll k = now_h + 1; k <= new_h; k++){ now_ans += segw2.prod(A[k], L) + segw1.prod(0, A[k]) * A[k]; segh1.set(A[k], segh1.get(A[k]) + 1); segh2.set(A[k], segh2.get(A[k]) + A[k]); } } else{ for (ll k = now_h; k > new_h; k--){ now_ans -= (segw2.prod(A[k], L) + segw1.prod(0, A[k]) * A[k]); segh1.set(A[k], segh1.get(A[k]) - 1); segh2.set(A[k], segh2.get(A[k]) - A[k]); } } if (now_w < new_w){ for (ll k = now_w + 1; k <= new_w; k++){ now_ans += segh2.prod(B[k], L) + segh1.prod(0, B[k]) * B[k]; segw1.set(B[k], segw1.get(B[k]) + 1); segw2.set(B[k], segw2.get(B[k]) + B[k]); } } else{ for (ll k = now_w; k > new_w; k--){ now_ans -= (segh2.prod(B[k], L) + segh1.prod(0, B[k]) * B[k]); segw1.set(B[k], segw1.get(B[k]) - 1); segw2.set(B[k], segw2.get(B[k]) - B[k]); } } now_h = new_h; now_w = new_w; if (sign == 1){ ans[id] += now_ans; } else{ ans[id] -= now_ans; } } } for (ll i = 0; i < Q; i++){ cout << ans[i] << endl; } }