#include #include using namespace std; using ll = long long; #define rep(i, s, t) for (ll i = s; i < (ll)(t); i++) #define all(x) begin(x), end(x) template bool chmin(T& x, T y) { return x > y ? (x = y, true) : false; } template bool chmax(T& x, T y) { return x < y ? (x = y, true) : false; } void solve() { int n, q; cin >> n >> q; vector a(n), b(n); rep(i, 0, n) cin >> a[i]; rep(i, 0, n) cin >> b[i]; int bsz = 100; vector> bv; vector> bvsm; int m = 0; for (int i = 0; i < n; i += bsz) { m++; bv.push_back({}); rep(j, i, min(i + bsz, n)) { bv.back().push_back(b[i]); } sort(all(bv.back())); vector sm{0}; for (auto x : bv.back()) sm.push_back(sm.back() + x); bvsm.push_back(sm); } vector bsm(m, 0); int mx_ab = 1e5 + 10; atcoder::fenwick_tree ft(mx_ab); atcoder::fenwick_tree ft_sm(mx_ab); auto add_x = [&](int x) { rep(i, 0, m) { int ln = bv[i].size(); int mnx = lower_bound(all(bv[i]), x) - bv[i].begin(); bsm[i] += (ll)(ln - mnx) * x; bsm[i] += bvsm[i][ln] - bvsm[i][mnx]; } ft.add(x, 1); ft_sm.add(x, x); }; auto prod = [&](int l, int r) { int bl = (l + bsz - 1) / bsz; int br = r / bsz; ll ans = 0; if (bl <= br) { rep(i, l, bl * bsz) { ans += ft.sum(0, b[i]) * b[i]; ans += ft_sm.sum(b[i], mx_ab); } rep(i, bl, br) { ans += bsm[i]; } rep(i, br * bsz, r) { ans += ft.sum(0, b[i]) * b[i]; ans += ft_sm.sum(b[i], mx_ab); } } else { rep(i, l, r) { ans += ft.sum(0, b[i]) * b[i]; ans += ft_sm.sum(b[i], mx_ab); } } return ans; }; vector ans(q, 0); vector>> query(n + 1); rep(i, 0, q) { int l, d, r, u; cin >> l >> d >> r >> u; l--, d--; query[l].push_back({d, u, (int)i, -1}); query[r].push_back({d, u, (int)i, 1}); } for (auto [l, r, i, d] : query[0]) { ans[i] += prod(l, r) * d; } rep(i, 0, n) { add_x(a[i]); for (auto [l, r, j, d] : query[i + 1]) { ans[j] += prod(l, r) * d; } } rep(i, 0, q) cout << ans[i] << '\n'; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cout << fixed << setprecision(15); int t = 1; // cin >> t; while (t--) solve(); }