#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define ff first
#define ss second
#define ins insert
#define pb push_back
#define eb emplace_back
#define sz(x) int((x).size())
#define all(x) begin(x), end(x)
typedef long long ll;
typedef unsigned long long ull;
#define forn(i, n) for (int i = 0; i < n; ++i)
#define each(i, x) for (auto &&i : x)
#define forne(i,x,n) for (int i = x; i < n; ++i)
#define show(x) for (auto &&i : x) {cerr << i <<' ';} cerr<< endl;
void dbg_out() { cerr << ']' << endl; }
template<typename Head, typename... Tail>
void dbg_out(Head H, Tail... T) { cerr << H;if (sizeof...(T)) cerr << ',' << ' '; dbg_out(T...); }
#ifdef LOCAL
#define dbg(...) cerr << '|' << __LINE__ << '|'<< '{' << #__VA_ARGS__ << '}'<<':'<<' '<<'[', dbg_out(__VA_ARGS__)
#else
#define dbg(...)
#endif
#define int int64_t
#define ii pair<int,int>
constexpr int mxN = 2 * 1e5 + 100;
int n, m, ans;
vector<int>nums;
int cnt[mxN];
void add(int x) {
if (++cnt[nums[x]] == 1) ans++;
}
void del(int x) {
if (--cnt[nums[x]] == 0) ans--;
}
int get_ans() {
return ans;
}
vector<int> mo(const vector<ii>& q) {
int l = 0, r = -1, blk = 350; // sqrt(n)
vector<int> inx(sz(q)), ans(sz(q));
auto K = [&](const ii& x) -> ii {
return ii(x.ff / blk, x.ss ^ -(x.ff / blk & 1));
};
iota(all(inx), 0);
sort(all(inx), [&](int a, int b) -> bool {
return K(q[a]) < K(q[b]);
});
for (int nxt : inx) {
ii it = q[nxt];
while (r < it.ss) add(++r);
while (l > it.ff) add(--l);
while (r > it.ss) del(r--);
while (l < it.ff) del(l++);
ans[nxt] = get_ans();
}
return ans;
}
template<typename T>
struct COO_COMPRESS {
vector<T> nums;
bool is_compress = true;
int size() {
if (!is_compress) compress();
return sz(nums);
}
void clear() {
nums.clear();
is_compress = true;
}
void insert(T x) {
nums.pb(x);
is_compress = false;
}
void compress() {
sort(all(nums));
nums.resize(unique(all(nums)) - nums.begin());
is_compress = true;
}
vector<T> compress_offline(vector<T> nums) {
if (!sz(nums))return nums;
vector<pair<T, int>> vvv;
forn(i, sz(nums)) vvv.pb({ nums[i],i });
sort(all(vvv));
int cont = 0;
T last = vvv[0].first;
nums[vvv[0].second] = 0;
forne(i, 1, sz(vvv)) {
if (vvv[i].first != last) cont++, last = vvv[i].first;
nums[vvv[i].second] = cont;
}
return nums;
}
int get(T x) {
if (!is_compress) compress();
int pos = lower_bound(all(nums), x) - nums.begin();
assert(pos != sz(nums) && nums[pos] == x);
return pos;
}
T iget(int x) {
if (!is_compress) compress();
assert(0 <= x && x < sz(nums));
return nums[x];
}
};
main() {
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin >> n >> m;
nums = vector<int>(n);
COO_COMPRESS<int>com;
forn(i, n) cin >> nums[i], com.insert(nums[i]);
vector<ii> qry(m);
forn(i, m) {
int x, y; cin >> x >> y;
x--, y--;
qry[i] = { x,y };
}
forn(i, n) nums[i] = com.get(nums[i]);
// show(nums);
auto ans = mo(qry);
each(i, ans) cout << i << endl;
cout << flush;
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgZW5kbCAgICAgJ1xuJyAKI2RlZmluZSBmZiAgICAgICAgZmlyc3QKI2RlZmluZSBzcyAgICAgICAgc2Vjb25kCiNkZWZpbmUgaW5zICAgICAgaW5zZXJ0CiNkZWZpbmUgcGIgICAgICAgcHVzaF9iYWNrCiNkZWZpbmUgZWIgICAgICAgZW1wbGFjZV9iYWNrCiNkZWZpbmUgc3ooeCkgICAgaW50KCh4KS5zaXplKCkpCiNkZWZpbmUgYWxsKHgpICAgYmVnaW4oeCksIGVuZCh4KQp0eXBlZGVmIGxvbmcgbG9uZyBsbDsKdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgdWxsOwojZGVmaW5lIGZvcm4oaSwgbikgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyArK2kpCiNkZWZpbmUgZWFjaChpLCB4KSBmb3IgKGF1dG8gJiZpIDogeCkKI2RlZmluZSBmb3JuZShpLHgsbikgZm9yIChpbnQgaSA9IHg7IGkgPCBuOyArK2kpCiNkZWZpbmUgc2hvdyh4KSBmb3IgKGF1dG8gJiZpIDogeCkge2NlcnIgPDwgaSA8PCcgJzt9IGNlcnI8PCBlbmRsOwogCiAKdm9pZCBkYmdfb3V0KCkgeyBjZXJyIDw8ICddJyA8PCBlbmRsOyB9CnRlbXBsYXRlPHR5cGVuYW1lIEhlYWQsIHR5cGVuYW1lLi4uIFRhaWw+CnZvaWQgZGJnX291dChIZWFkIEgsIFRhaWwuLi4gVCkgeyBjZXJyIDw8IEg7aWYgKHNpemVvZi4uLihUKSkgY2VyciA8PCAnLCcgPDwgJyAnOyBkYmdfb3V0KFQuLi4pOyB9CiNpZmRlZiBMT0NBTCAKI2RlZmluZSBkYmcoLi4uKSBjZXJyIDw8ICd8JyA8PCBfX0xJTkVfXyA8PCAnfCc8PCAneycgPDwgI19fVkFfQVJHU19fIDw8ICd9Jzw8JzonPDwnICc8PCdbJywgZGJnX291dChfX1ZBX0FSR1NfXykKI2Vsc2UKI2RlZmluZSBkYmcoLi4uKQojZW5kaWYKI2RlZmluZSBpbnQgaW50NjRfdAojZGVmaW5lIGlpIHBhaXI8aW50LGludD4KIApjb25zdGV4cHIgaW50IG14TiA9IDIgKiAxZTUgKyAxMDA7CmludCBuLCBtLCBhbnM7CnZlY3RvcjxpbnQ+bnVtczsKaW50IGNudFtteE5dOwogCnZvaWQgYWRkKGludCB4KSB7CiAgICBpZiAoKytjbnRbbnVtc1t4XV0gPT0gMSkgYW5zKys7Cn0Kdm9pZCBkZWwoaW50IHgpIHsKICAgIGlmICgtLWNudFtudW1zW3hdXSA9PSAwKSBhbnMtLTsKfQppbnQgZ2V0X2FucygpIHsKICAgIHJldHVybiBhbnM7Cn0KIAp2ZWN0b3I8aW50PiBtbyhjb25zdCB2ZWN0b3I8aWk+JiBxKSB7CiAgICBpbnQgbCA9IDAsIHIgPSAtMSwgYmxrID0gMzUwOyAvLyBzcXJ0KG4pCiAgICB2ZWN0b3I8aW50PiBpbngoc3oocSkpLCBhbnMoc3oocSkpOwogICAgYXV0byBLID0gWyZdKGNvbnN0IGlpJiB4KSAtPiBpaSB7CiAgICAgICAgcmV0dXJuIGlpKHguZmYgLyBibGssIHguc3MgXiAtKHguZmYgLyBibGsgJiAxKSk7CiAgICAgICAgfTsKICAgIGlvdGEoYWxsKGlueCksIDApOwogICAgc29ydChhbGwoaW54KSwgWyZdKGludCBhLCBpbnQgYikgLT4gYm9vbCB7CiAgICAgICAgcmV0dXJuIEsocVthXSkgPCBLKHFbYl0pOwogICAgICAgIH0pOwogICAgZm9yIChpbnQgbnh0IDogaW54KSB7CiAgICAgICAgaWkgaXQgPSBxW254dF07CiAgICAgICAgd2hpbGUgKHIgPCBpdC5zcykgYWRkKCsrcik7CiAgICAgICAgd2hpbGUgKGwgPiBpdC5mZikgYWRkKC0tbCk7CiAgICAgICAgd2hpbGUgKHIgPiBpdC5zcykgZGVsKHItLSk7CiAgICAgICAgd2hpbGUgKGwgPCBpdC5mZikgZGVsKGwrKyk7CiAgICAgICAgYW5zW254dF0gPSBnZXRfYW5zKCk7CiAgICB9CiAgICByZXR1cm4gYW5zOwp9CiAKdGVtcGxhdGU8dHlwZW5hbWUgVD4Kc3RydWN0IENPT19DT01QUkVTUyB7CiAgICB2ZWN0b3I8VD4gbnVtczsKICAgIGJvb2wgaXNfY29tcHJlc3MgPSB0cnVlOwogCiAgICBpbnQgc2l6ZSgpIHsKICAgICAgICBpZiAoIWlzX2NvbXByZXNzKSBjb21wcmVzcygpOwogICAgICAgIHJldHVybiBzeihudW1zKTsKICAgIH0KIAogICAgdm9pZCBjbGVhcigpIHsKICAgICAgICBudW1zLmNsZWFyKCk7CiAgICAgICAgaXNfY29tcHJlc3MgPSB0cnVlOwogICAgfQogCiAgICB2b2lkIGluc2VydChUIHgpIHsKICAgICAgICBudW1zLnBiKHgpOwogICAgICAgIGlzX2NvbXByZXNzID0gZmFsc2U7CiAgICB9CiAKICAgIHZvaWQgY29tcHJlc3MoKSB7CiAgICAgICAgc29ydChhbGwobnVtcykpOwogICAgICAgIG51bXMucmVzaXplKHVuaXF1ZShhbGwobnVtcykpIC0gbnVtcy5iZWdpbigpKTsKICAgICAgICBpc19jb21wcmVzcyA9IHRydWU7CiAgICB9CiAKICAgIHZlY3RvcjxUPiBjb21wcmVzc19vZmZsaW5lKHZlY3RvcjxUPiBudW1zKSB7CiAgICAgICAgaWYgKCFzeihudW1zKSlyZXR1cm4gbnVtczsKICAgICAgICB2ZWN0b3I8cGFpcjxULCBpbnQ+PiB2dnY7CiAgICAgICAgZm9ybihpLCBzeihudW1zKSkgdnZ2LnBiKHsgbnVtc1tpXSxpIH0pOwogICAgICAgIHNvcnQoYWxsKHZ2dikpOwogICAgICAgIGludCBjb250ID0gMDsKICAgICAgICBUIGxhc3QgPSB2dnZbMF0uZmlyc3Q7CiAgICAgICAgbnVtc1t2dnZbMF0uc2Vjb25kXSA9IDA7CiAgICAgICAgZm9ybmUoaSwgMSwgc3oodnZ2KSkgewogICAgICAgICAgICBpZiAodnZ2W2ldLmZpcnN0ICE9IGxhc3QpIGNvbnQrKywgbGFzdCA9IHZ2dltpXS5maXJzdDsKICAgICAgICAgICAgbnVtc1t2dnZbaV0uc2Vjb25kXSA9IGNvbnQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiBudW1zOwogICAgfQogCiAgICBpbnQgZ2V0KFQgeCkgewogICAgICAgIGlmICghaXNfY29tcHJlc3MpIGNvbXByZXNzKCk7CiAgICAgICAgaW50IHBvcyA9IGxvd2VyX2JvdW5kKGFsbChudW1zKSwgeCkgLSBudW1zLmJlZ2luKCk7CiAgICAgICAgYXNzZXJ0KHBvcyAhPSBzeihudW1zKSAmJiBudW1zW3Bvc10gPT0geCk7CiAgICAgICAgcmV0dXJuIHBvczsKICAgIH0KIAogICAgVCBpZ2V0KGludCB4KSB7CiAgICAgICAgaWYgKCFpc19jb21wcmVzcykgY29tcHJlc3MoKTsKICAgICAgICBhc3NlcnQoMCA8PSB4ICYmIHggPCBzeihudW1zKSk7CiAgICAgICAgcmV0dXJuIG51bXNbeF07CiAgICB9Cn07CiAKIAptYWluKCkgewogICAgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbygwKTsgY2luLnRpZSgwKTsgY291dC50aWUoMCk7CiAKICAgIGNpbiA+PiBuID4+IG07CiAgICBudW1zID0gdmVjdG9yPGludD4obik7CiAgICBDT09fQ09NUFJFU1M8aW50PmNvbTsKICAgIGZvcm4oaSwgbikgY2luID4+IG51bXNbaV0sIGNvbS5pbnNlcnQobnVtc1tpXSk7CiAKICAgIHZlY3RvcjxpaT4gcXJ5KG0pOwogICAgZm9ybihpLCBtKSB7CiAgICAgICAgaW50IHgsIHk7IGNpbiA+PiB4ID4+IHk7CiAgICAgICAgeC0tLCB5LS07CiAgICAgICAgcXJ5W2ldID0geyB4LHkgfTsKICAgIH0KIAogICAgZm9ybihpLCBuKSBudW1zW2ldID0gY29tLmdldChudW1zW2ldKTsKICAgIC8vIHNob3cobnVtcyk7CiAKICAgIGF1dG8gYW5zID0gbW8ocXJ5KTsKIAogICAgZWFjaChpLCBhbnMpIGNvdXQgPDwgaSA8PCBlbmRsOwogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAgICBjb3V0IDw8IGZsdXNoOwogICAgcmV0dXJuIDA7Cn0=