#include <bits/stdc++.h>
using namespace std;
const int N = 100004;
int n, q, a[N], freq[N], blockSize, ans[N];
int curAns = 0;
struct Query {
int l, r, idx;
} queryList[N];
void add(int x) {
if (freq[a[x]] == 0) curAns++;
freq[a[x]]++;
}
void rem(int x) {
freq[a[x]]--;
if (freq[a[x]] == 0) curAns--;
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cin >> n >> q;
blockSize = sqrt(n);
for (int i = 0; i < n; i++) cin >> a[i];
for (int i = 0; i < q; i++) {
cin >> queryList[i].l >> queryList[i].r;
queryList[i].idx = i;
}
sort(queryList, queryList + q, [](Query x, Query y) {
int bx = x.l / blockSize, by = y.l / blockSize;
if (bx != by) return bx < by;
return (bx & 1) ? x.r > y.r : x.r < y.r;
});
int l = 0, r = -1;
for (int i = 0; i < q; i++) {
int L = queryList[i].l, R = queryList[i].r;
while (r < R) add(++r);
while (r > R) rem(r--);
while (l < L) rem(l++);
while (l > L) add(--l);
ans[queryList[i].idx] = curAns;
}
for (int i = 0; i < q; i++) cout << ans[i] << '\n';
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgpjb25zdCBpbnQgTiA9IDEwMDAwNDsKaW50IG4sIHEsIGFbTl0sIGZyZXFbTl0sIGJsb2NrU2l6ZSwgYW5zW05dOwppbnQgY3VyQW5zID0gMDsKCnN0cnVjdCBRdWVyeSB7CiAgICBpbnQgbCwgciwgaWR4Owp9IHF1ZXJ5TGlzdFtOXTsKCnZvaWQgYWRkKGludCB4KSB7CiAgICBpZiAoZnJlcVthW3hdXSA9PSAwKSBjdXJBbnMrKzsKICAgIGZyZXFbYVt4XV0rKzsKfQoKdm9pZCByZW0oaW50IHgpIHsKICAgIGZyZXFbYVt4XV0tLTsKICAgIGlmIChmcmVxW2FbeF1dID09IDApIGN1ckFucy0tOwp9CgpzaWduZWQgbWFpbigpIHsKICAgIGlvczo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsKICAgIGNpbi50aWUoTlVMTCk7CiAgICBjaW4gPj4gbiA+PiBxOwogICAgYmxvY2tTaXplID0gc3FydChuKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSBjaW4gPj4gYVtpXTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcTsgaSsrKSB7CiAgICAgICAgY2luID4+IHF1ZXJ5TGlzdFtpXS5sID4+IHF1ZXJ5TGlzdFtpXS5yOwogICAgICAgIHF1ZXJ5TGlzdFtpXS5pZHggPSBpOwogICAgfQogICAgc29ydChxdWVyeUxpc3QsIHF1ZXJ5TGlzdCArIHEsIFtdKFF1ZXJ5IHgsIFF1ZXJ5IHkpIHsKICAgICAgICBpbnQgYnggPSB4LmwgLyBibG9ja1NpemUsIGJ5ID0geS5sIC8gYmxvY2tTaXplOwogICAgICAgIGlmIChieCAhPSBieSkgcmV0dXJuIGJ4IDwgYnk7CiAgICAgICAgcmV0dXJuIChieCAmIDEpID8geC5yID4geS5yIDogeC5yIDwgeS5yOwogICAgfSk7CgogICAgaW50IGwgPSAwLCByID0gLTE7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHE7IGkrKykgewogICAgICAgIGludCBMID0gcXVlcnlMaXN0W2ldLmwsIFIgPSBxdWVyeUxpc3RbaV0ucjsKICAgICAgICB3aGlsZSAociA8IFIpIGFkZCgrK3IpOwogICAgICAgIHdoaWxlIChyID4gUikgcmVtKHItLSk7CiAgICAgICAgd2hpbGUgKGwgPCBMKSByZW0obCsrKTsKICAgICAgICB3aGlsZSAobCA+IEwpIGFkZCgtLWwpOwogICAgICAgIGFuc1txdWVyeUxpc3RbaV0uaWR4XSA9IGN1ckFuczsKICAgIH0KCiAgICBmb3IgKGludCBpID0gMDsgaSA8IHE7IGkrKykgY291dCA8PCBhbnNbaV0gPDwgJ1xuJzsKfQo=