#include <bits/stdc++.h>
using namespace std;
//
const int mx = 1e5 + 5;
const int S = 320;
//
struct query
{
int l, r, a, b, id;
//
bool operator < (const query &other)
{
if (l / S != other.l / S)
return l < other.l;
return l / S & 1 ? r < other.r : r > other.r;
}
};
//
int n, q, A[mx];
int cnt[mx];
pair<int, int> block[S], ans[mx];
query Q[mx];
//
void update (int pos, int val)
{
if (pos == 0)
return;
//
int id = pos / S;
//
block[id].first += val;
if (cnt[pos] == 0)
++block[id].second;
cnt[pos] += val;
if (cnt[pos] == 0)
--block[id].second;
}
void operator += (pair<int, int> &a, const pair<int, int> &b)
{
a.first += b.first;
a.second += b.second;
}
pair<int, int> get (int a, int b)
{
int block_a = a / S, block_b = b / S;
pair<int, int> res(0, 0);
//
if (block_a == block_b)
{
for (int i = a; i <= b; ++i)
res += make_pair(cnt[i], cnt[i] > 0);
return res;
}
++block_a, ++b;
for (int i = block_a; i < block_b; ++i)
res += block[i];
for (int i = a; i < block_a * S; ++i)
res += make_pair(cnt[i], cnt[i] > 0);
for (int i = block_b * S; i < b; ++i)
res += make_pair(cnt[i], cnt[i] > 0);
return res;
}
void calc (void)
{
int l = 0, r = 0;
//
for (int i = 1; i <= q; ++i)
{
while (l < Q[i].l)
update(A[l++], -1);
while (l > Q[i].l)
update(A[--l], 1);
while (r < Q[i].r)
update(A[++r], 1);
while (r > Q[i].r)
update(A[r--], -1);
ans[Q[i].id] = get(Q[i].a, Q[i].b);
}
}
//
void process (void)
{
cin >> n >> q;
for (int i = 1; i <= n; ++i)
cin >> A[i];
for (int i = 1; i <= q; ++i)
cin >> Q[i].l >> Q[i].r >> Q[i].a >> Q[i].b,
Q[i].id = i;
sort(Q + 1, Q + q + 1);
calc();
for (int i = 1; i <= q; ++i)
cout << ans[i].first << ' ' << ans[i].second << '\n';
}
//
signed main (void)
{
ios_base::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
process();
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci8vCmNvbnN0IGludCBteCA9IDFlNSArIDU7CmNvbnN0IGludCBTID0gMzIwOwovLwpzdHJ1Y3QgcXVlcnkKewogICAgaW50IGwsIHIsIGEsIGIsIGlkOwogICAgLy8KICAgIGJvb2wgb3BlcmF0b3IgPCAoY29uc3QgcXVlcnkgJm90aGVyKQogICAgewogICAgICAgIGlmIChsIC8gUyAhPSBvdGhlci5sIC8gUykKICAgICAgICAgICAgcmV0dXJuIGwgPCBvdGhlci5sOwogICAgICAgIHJldHVybiBsIC8gUyAmIDEgPyByIDwgb3RoZXIuciA6IHIgPiBvdGhlci5yOwogICAgfQp9OwovLwppbnQgbiwgcSwgQVtteF07CmludCBjbnRbbXhdOwpwYWlyPGludCwgaW50PiBibG9ja1tTXSwgYW5zW214XTsKcXVlcnkgUVtteF07Ci8vCnZvaWQgdXBkYXRlIChpbnQgcG9zLCBpbnQgdmFsKQp7CiAgICBpZiAocG9zID09IDApCiAgICAgICAgcmV0dXJuOwogICAgLy8KICAgIGludCBpZCA9IHBvcyAvIFM7CiAgICAvLwogICAgYmxvY2tbaWRdLmZpcnN0ICs9IHZhbDsKICAgIGlmIChjbnRbcG9zXSA9PSAwKQogICAgICAgICsrYmxvY2tbaWRdLnNlY29uZDsKICAgIGNudFtwb3NdICs9IHZhbDsKICAgIGlmIChjbnRbcG9zXSA9PSAwKQogICAgICAgIC0tYmxvY2tbaWRdLnNlY29uZDsKfQp2b2lkIG9wZXJhdG9yICs9IChwYWlyPGludCwgaW50PiAmYSwgY29uc3QgcGFpcjxpbnQsIGludD4gJmIpCnsKICAgIGEuZmlyc3QgKz0gYi5maXJzdDsKICAgIGEuc2Vjb25kICs9IGIuc2Vjb25kOwp9CnBhaXI8aW50LCBpbnQ+IGdldCAoaW50IGEsIGludCBiKQp7CiAgICBpbnQgYmxvY2tfYSA9IGEgLyBTLCBibG9ja19iID0gYiAvIFM7CiAgICBwYWlyPGludCwgaW50PiByZXMoMCwgMCk7CiAgICAvLwogICAgaWYgKGJsb2NrX2EgPT0gYmxvY2tfYikKICAgIHsKICAgICAgICBmb3IgKGludCBpID0gYTsgaSA8PSBiOyArK2kpCiAgICAgICAgICAgIHJlcyArPSBtYWtlX3BhaXIoY250W2ldLCBjbnRbaV0gPiAwKTsKICAgICAgICByZXR1cm4gcmVzOwogICAgfQogICAgKytibG9ja19hLCArK2I7CiAgICBmb3IgKGludCBpID0gYmxvY2tfYTsgaSA8IGJsb2NrX2I7ICsraSkKICAgICAgICByZXMgKz0gYmxvY2tbaV07CiAgICBmb3IgKGludCBpID0gYTsgaSA8IGJsb2NrX2EgKiBTOyArK2kpCiAgICAgICAgcmVzICs9IG1ha2VfcGFpcihjbnRbaV0sIGNudFtpXSA+IDApOwogICAgZm9yIChpbnQgaSA9IGJsb2NrX2IgKiBTOyBpIDwgYjsgKytpKQogICAgICAgIHJlcyArPSBtYWtlX3BhaXIoY250W2ldLCBjbnRbaV0gPiAwKTsKICAgIHJldHVybiByZXM7Cn0Kdm9pZCBjYWxjICh2b2lkKQp7CiAgICBpbnQgbCA9IDAsIHIgPSAwOwogICAgLy8KICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IHE7ICsraSkKICAgIHsKICAgICAgICB3aGlsZSAobCA8IFFbaV0ubCkKICAgICAgICAgICAgdXBkYXRlKEFbbCsrXSwgLTEpOwogICAgICAgIHdoaWxlIChsID4gUVtpXS5sKQogICAgICAgICAgICB1cGRhdGUoQVstLWxdLCAxKTsKICAgICAgICB3aGlsZSAociA8IFFbaV0ucikKICAgICAgICAgICAgdXBkYXRlKEFbKytyXSwgMSk7CiAgICAgICAgd2hpbGUgKHIgPiBRW2ldLnIpCiAgICAgICAgICAgIHVwZGF0ZShBW3ItLV0sIC0xKTsKICAgICAgICBhbnNbUVtpXS5pZF0gPSBnZXQoUVtpXS5hLCBRW2ldLmIpOwogICAgfQp9Ci8vCnZvaWQgcHJvY2VzcyAodm9pZCkKewogICAgY2luID4+IG4gPj4gcTsKICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG47ICsraSkKICAgICAgICBjaW4gPj4gQVtpXTsKICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IHE7ICsraSkKICAgICAgICBjaW4gPj4gUVtpXS5sID4+IFFbaV0uciA+PiBRW2ldLmEgPj4gUVtpXS5iLAogICAgICAgIFFbaV0uaWQgPSBpOwoKICAgIHNvcnQoUSArIDEsIFEgKyBxICsgMSk7CiAgICBjYWxjKCk7CgogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gcTsgKytpKQogICAgICAgIGNvdXQgPDwgYW5zW2ldLmZpcnN0IDw8ICcgJyA8PCBhbnNbaV0uc2Vjb25kIDw8ICdcbic7Cn0KLy8Kc2lnbmVkIG1haW4gKHZvaWQpCnsKICAgIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpLCBjaW4udGllKG51bGxwdHIpLCBjb3V0LnRpZShudWxscHRyKTsKICAgIHByb2Nlc3MoKTsKfQ==