#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 5e4+5;
int n, q, a[N];
namespace Subtask1 {
int f1[1005], f2[1005];
bool check() {
return n <= 1000 && q <= 1000;
}
void solve() {
while (q--) {
int x, y, u, v; cin >> x >> y >> u >> v;
memset(f1, 0, sizeof f1);
memset(f2, 0, sizeof f2);
for (int i = x; i <= y; i++) f1[a[i]]++;
for (int i = u; i <= v; i++) f2[a[i]]++;
ll ans = 0;
for (int i = 1; i <= n; i++) ans += 1LL * f1[i] * f2[i];
cout << ans << '\n';
}
}
}
namespace Subtask2 {
int P[55][N];
bool check() {
return *max_element(a + 1, a + n + 1) <= 50;
}
int query(int x, int l, int r) {
return P[x][r] - P[x][l - 1];
}
void solve() {
for (int x = 1; x <= 50; x++)
for (int i = 1; i <= n; i++)
P[x][i] = P[x][i - 1] + (a[i] == x);
while (q--) {
int x, y, u, v; cin >> x >> y >> u >> v;
ll ans = 0;
for (int val = 1; val <= 50; val++)
ans += 1LL * query(val, x, y) * query(val, u, v);
cout << ans << '\n';
}
}
}
namespace Fulltask {
int B;
struct Query {
int r1, r2, id, sign;
bool operator<(const Query& o) const {
int b1 = r1 / B, b2 = o.r1 / B;
if (b1 != b2) return b1 < b2;
return (b1 & 1) ? (r2 < o.r2) : (r2 > o.r2);
}
};
int cnt1[N], cnt2[N];
ll ans[N], cur_ans = 0;
inline void add1(int p) {
cur_ans += cnt2[a[p]];
cnt1[a[p]]++;
}
inline void remove1(int p) {
cnt1[a[p]]--;
cur_ans -= cnt2[a[p]];
}
inline void add2(int p) {
cur_ans += cnt1[a[p]];
cnt2[a[p]]++;
}
inline void remove2(int p) {
cnt2[a[p]]--;
cur_ans -= cnt1[a[p]];
}
void solve() {
vector<Query> qs;
for (int i = 0; i < q; i++) {
int x, y, u, v; cin >> x >> y >> u >> v;
qs.push_back({y, v, i, 1});
qs.push_back({y, u - 1, i, -1});
qs.push_back({x - 1, v, i, -1});
qs.push_back({x - 1, u - 1, i, 1});
}
B = max(1, (int)(n / sqrt(4 * q)));
sort(qs.begin(), qs.end());
int R1 = 0, R2 = 0;
for (int i = 0; i < (int)qs.size(); i++) {
int r1 = qs[i].r1, r2 = qs[i].r2;
while (R1 < r1) add1(++R1);
while (R1 > r1) remove1(R1--);
while (R2 < r2) add2(++R2);
while (R2 > r2) remove2(R2--);
ans[qs[i].id] += qs[i].sign * cur_ans;
}
for (int i = 0; i < q; i++) cout << ans[i] << '\n';
}
}
void solve() {
cin >> n >> q;
for (int i = 1; i <= n; i++) cin >> a[i];
if (Subtask1::check()) Subtask1::solve();
else if (Subtask2::check()) Subtask2::solve();
else Fulltask::solve();
}
int main() {
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define TASK "DAYSO"
if (fopen(TASK".INP", "r")) {
freopen(TASK".INP", "r", stdin);
freopen(TASK".OUT", "w", stdout);
}
int tests = 1; // cin >> tests;
while (tests--) solve();
#ifdef LOCAL
cerr << "\nTime elapsed: " << clock() << " ms.\n";
#endif
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp1c2luZyBsbCA9IGxvbmcgbG9uZzsKCmNvbnN0IGludCBOID0gNWU0KzU7CgppbnQgbiwgcSwgYVtOXTsKCm5hbWVzcGFjZSBTdWJ0YXNrMSB7CiAgICBpbnQgZjFbMTAwNV0sIGYyWzEwMDVdOwogICAgYm9vbCBjaGVjaygpIHsKICAgICAgICByZXR1cm4gbiA8PSAxMDAwICYmIHEgPD0gMTAwMDsKICAgIH0KICAgIHZvaWQgc29sdmUoKSB7CiAgICAgICAgd2hpbGUgKHEtLSkgewogICAgICAgICAgICBpbnQgeCwgeSwgdSwgdjsgY2luID4+IHggPj4geSA+PiB1ID4+IHY7CiAgICAgICAgICAgIG1lbXNldChmMSwgMCwgc2l6ZW9mIGYxKTsgCiAgICAgICAgICAgIG1lbXNldChmMiwgMCwgc2l6ZW9mIGYyKTsKICAgICAgICAgICAgZm9yIChpbnQgaSA9IHg7IGkgPD0geTsgaSsrKSBmMVthW2ldXSsrOwogICAgICAgICAgICBmb3IgKGludCBpID0gdTsgaSA8PSB2OyBpKyspIGYyW2FbaV1dKys7CiAgICAgICAgICAgIGxsIGFucyA9IDA7CiAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykgYW5zICs9IDFMTCAqIGYxW2ldICogZjJbaV07CiAgICAgICAgICAgIGNvdXQgPDwgYW5zIDw8ICdcbic7CiAgICAgICAgfQogICAgfQp9CgpuYW1lc3BhY2UgU3VidGFzazIgewogICAgaW50IFBbNTVdW05dOwogICAgYm9vbCBjaGVjaygpIHsKICAgICAgICByZXR1cm4gKm1heF9lbGVtZW50KGEgKyAxLCBhICsgbiArIDEpIDw9IDUwOwogICAgfQogICAgaW50IHF1ZXJ5KGludCB4LCBpbnQgbCwgaW50IHIpIHsKICAgICAgICByZXR1cm4gUFt4XVtyXSAtIFBbeF1bbCAtIDFdOwogICAgfQogICAgdm9pZCBzb2x2ZSgpIHsKICAgICAgICBmb3IgKGludCB4ID0gMTsgeCA8PSA1MDsgeCsrKQogICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8PSBuOyBpKyspIAogICAgICAgICAgICAgICAgUFt4XVtpXSA9IFBbeF1baSAtIDFdICsgKGFbaV0gPT0geCk7CiAgICAgICAgd2hpbGUgKHEtLSkgewogICAgICAgICAgICBpbnQgeCwgeSwgdSwgdjsgY2luID4+IHggPj4geSA+PiB1ID4+IHY7CiAgICAgICAgICAgIGxsIGFucyA9IDA7CiAgICAgICAgICAgIGZvciAoaW50IHZhbCA9IDE7IHZhbCA8PSA1MDsgdmFsKyspIAogICAgICAgICAgICAgICAgYW5zICs9IDFMTCAqIHF1ZXJ5KHZhbCwgeCwgeSkgKiBxdWVyeSh2YWwsIHUsIHYpOwogICAgICAgICAgICBjb3V0IDw8IGFucyA8PCAnXG4nOwogICAgICAgIH0KICAgIH0KfQoKbmFtZXNwYWNlIEZ1bGx0YXNrIHsKICAgIGludCBCOwogICAgc3RydWN0IFF1ZXJ5IHsKICAgICAgICBpbnQgcjEsIHIyLCBpZCwgc2lnbjsKICAgICAgICBib29sIG9wZXJhdG9yPChjb25zdCBRdWVyeSYgbykgY29uc3QgewogICAgICAgICAgICBpbnQgYjEgPSByMSAvIEIsIGIyID0gby5yMSAvIEI7CiAgICAgICAgICAgIGlmIChiMSAhPSBiMikgcmV0dXJuIGIxIDwgYjI7CiAgICAgICAgICAgIHJldHVybiAoYjEgJiAxKSA/IChyMiA8IG8ucjIpIDogKHIyID4gby5yMik7CiAgICAgICAgfQogICAgfTsKICAgIGludCBjbnQxW05dLCBjbnQyW05dOwogICAgbGwgYW5zW05dLCBjdXJfYW5zID0gMDsKICAgIGlubGluZSB2b2lkIGFkZDEoaW50IHApIHsKICAgICAgICBjdXJfYW5zICs9IGNudDJbYVtwXV07CiAgICAgICAgY250MVthW3BdXSsrOwogICAgfQogICAgaW5saW5lIHZvaWQgcmVtb3ZlMShpbnQgcCkgewogICAgICAgIGNudDFbYVtwXV0tLTsKICAgICAgICBjdXJfYW5zIC09IGNudDJbYVtwXV07CiAgICB9CiAgICBpbmxpbmUgdm9pZCBhZGQyKGludCBwKSB7CiAgICAgICAgY3VyX2FucyArPSBjbnQxW2FbcF1dOwogICAgICAgIGNudDJbYVtwXV0rKzsKICAgIH0KICAgIGlubGluZSB2b2lkIHJlbW92ZTIoaW50IHApIHsKICAgICAgICBjbnQyW2FbcF1dLS07CiAgICAgICAgY3VyX2FucyAtPSBjbnQxW2FbcF1dOwogICAgfQogICAgdm9pZCBzb2x2ZSgpIHsKICAgICAgICB2ZWN0b3I8UXVlcnk+IHFzOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcTsgaSsrKSB7CiAgICAgICAgICAgIGludCB4LCB5LCB1LCB2OyBjaW4gPj4geCA+PiB5ID4+IHUgPj4gdjsKICAgICAgICAgICAgcXMucHVzaF9iYWNrKHt5LCB2LCBpLCAxfSk7CiAgICAgICAgICAgIHFzLnB1c2hfYmFjayh7eSwgdSAtIDEsIGksIC0xfSk7CiAgICAgICAgICAgIHFzLnB1c2hfYmFjayh7eCAtIDEsIHYsIGksIC0xfSk7CiAgICAgICAgICAgIHFzLnB1c2hfYmFjayh7eCAtIDEsIHUgLSAxLCBpLCAxfSk7CiAgICAgICAgfQogICAgICAgIEIgPSBtYXgoMSwgKGludCkobiAvIHNxcnQoNCAqIHEpKSk7CiAgICAgICAgc29ydChxcy5iZWdpbigpLCBxcy5lbmQoKSk7CiAgICAgICAgaW50IFIxID0gMCwgUjIgPSAwOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgKGludClxcy5zaXplKCk7IGkrKykgewogICAgICAgICAgICBpbnQgcjEgPSBxc1tpXS5yMSwgcjIgPSBxc1tpXS5yMjsKICAgICAgICAgICAgd2hpbGUgKFIxIDwgcjEpIGFkZDEoKytSMSk7CiAgICAgICAgICAgIHdoaWxlIChSMSA+IHIxKSByZW1vdmUxKFIxLS0pOwogICAgICAgICAgICB3aGlsZSAoUjIgPCByMikgYWRkMigrK1IyKTsKICAgICAgICAgICAgd2hpbGUgKFIyID4gcjIpIHJlbW92ZTIoUjItLSk7CiAgICAgICAgICAgIGFuc1txc1tpXS5pZF0gKz0gcXNbaV0uc2lnbiAqIGN1cl9hbnM7CiAgICAgICAgfQogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcTsgaSsrKSBjb3V0IDw8IGFuc1tpXSA8PCAnXG4nOwogICAgfQp9Cgp2b2lkIHNvbHZlKCkgewogICAgY2luID4+IG4gPj4gcTsKICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykgY2luID4+IGFbaV07CiAgICBpZiAoU3VidGFzazE6OmNoZWNrKCkpIFN1YnRhc2sxOjpzb2x2ZSgpOwogICAgZWxzZSBpZiAoU3VidGFzazI6OmNoZWNrKCkpIFN1YnRhc2syOjpzb2x2ZSgpOwogICAgZWxzZSBGdWxsdGFzazo6c29sdmUoKTsKfQoKaW50IG1haW4oKSB7CiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKDApOyBjaW4udGllKDApOyBjb3V0LnRpZSgwKTsKCiAgICAjZGVmaW5lIFRBU0sgIkRBWVNPIgogICAgaWYgKGZvcGVuKFRBU0siLklOUCIsICJyIikpIHsKICAgICAgICBmcmVvcGVuKFRBU0siLklOUCIsICJyIiwgc3RkaW4pOwogICAgICAgIGZyZW9wZW4oVEFTSyIuT1VUIiwgInciLCBzdGRvdXQpOwogICAgfQogICAgCiAgICBpbnQgdGVzdHMgPSAxOyAvLyBjaW4gPj4gdGVzdHM7CiAgICB3aGlsZSAodGVzdHMtLSkgc29sdmUoKTsKCiAgICAjaWZkZWYgTE9DQUwKICAgIGNlcnIgPDwgIlxuVGltZSBlbGFwc2VkOiAiIDw8IGNsb2NrKCkgPDwgIiBtcy5cbiI7CiAgICAjZW5kaWYKICAgIHJldHVybiAwOwp9Cg==