#include <bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
typedef long long ll;
typedef unsigned long long ull;
typedef vector<int> vi;
typedef vector<ll> vll;
typedef vector<vi> vvi;
typedef vector<vll> vvll;
typedef vector<string> vs;
typedef pair<int, int> pi;
typedef pair<ll, ll> pll;
typedef vector<pair<int, int>> vpi;
typedef vector<pair<ll, ll>> vpll;
typedef set<int> si;
typedef set<ll> sll;
typedef set<pair<int, int>> spi;
typedef set<pair<ll, ll>> spll;
typedef multiset<int> msi;
typedef multiset<ll> msll;
typedef multiset<pair<int, int>> mspi;
typedef multiset<pair<ll, ll>> mspll;
typedef map<int, int> mpi;
typedef map<ll, ll> mpll;
typedef tree<ll, null_type, less<ll>, rb_tree_tag, tree_order_statistics_node_update> ordered_set; // find_by_order, order_of_key, less, greater,less_equal
typedef tree<ll, null_type, less_equal<ll>, rb_tree_tag, tree_order_statistics_node_update> ordered_multiset;
#include<iomanip>
#define fastio ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
#define e "\n"
#define yes cout<<"Yes"<<e;
#define no cout<<"No"<<e;
#define pb push_back
#define ff first
#define ss second
#define sz size()
#define mod 1000000007 //1e9+7 1000000007 998244353
#define fr(i,a,b) for(ll i=a;i<b;i++)
#define fr2(i,a,b) for(ll i=a;i>=b;i--)
#define coutv(v) for(auto it:v)cout<<it<<' ';cout<<e
#define cinv(v) for(auto &it:v)cin>>it
#define all(a) a.begin(),a.end()
#define rall(a) a.rbegin(),a.rend()
#define Ceil(x,y) ((x+y-1)/y)
#define INF (1LL<<62)
#define read freopen("binary.in","r",stdin)
#define write freopen("cricket.out","w",stdout)
const double PI = acos(-1);
const ll infll = LLONG_MAX;
const ll mn = LLONG_MIN;
const int inf = INT_MAX;
bool cmp1(pair<ll, ll> x1, pair<ll, ll> x2) {
return x1.ss < x2.ss;
}
bool cmp2(pair<ll, ll> x1, pair<ll, ll> x2) {
if ( x1.ff == x2.ff ) return x1.ss < x2.ss;
return x1.ff < x2.ff;
}
bool cmp3(pair<ll, ll> x1, pair<ll, ll> x2) {
if ( x1.ff == x2.ff ) return x1.ss > x2.ss;
return x1.ff > x2.ff;
}
void solve() {
}
int block_size = 447; //for 2e5
int n, q;
struct Query {
int l, r, idx;
bool operator<(Query other) const
{
return make_pair(l / block_size, r) <
make_pair(other.l / block_size, other.r);
}
};
vector<Query> Q;
vi v(200005, 0);
vi freq(200005, 0);
int cnt=0;
void rem(int idx) { // TODO: remove value at idx from data structure
freq[ v[idx] ]--;
if( freq[ v[idx] ] == 0 ) cnt--;
}
void add(int idx) { // TODO: add value at idx from data structure
freq[ v[idx] ]++;
if( freq[ v[idx] ] == 1 ) cnt++;
}
ll get_answer(int val) { // TODO: extract the current answer of the data structure
return val;
}
vector<int> mo_s(vector<Query>& queries) {
vector<int> answers( (int)queries.size());
sort(queries.begin(), queries.end());
// TODO: initialize data structure
int cur_l = 0;
int cur_r = -1; // because of query [0, 0]
// invariant: data structure will always reflect the range [cur_l, cur_r]
for (Query q : queries) {
while (cur_l > q.l) {
cur_l--;
add(cur_l);
}
while (cur_r < q.r) {
cur_r++;
add(cur_r);
}
while (cur_l < q.l) {
rem(cur_l);
cur_l++;
}
while (cur_r > q.r) {
rem(cur_r);
cur_r--;
}
answers[q.idx] = get_answer(cnt);
}
return answers;
}
int main() {
fastio
int t = 1, tc = 1;
//cin >> t;
while ( t-- ) {
//ll n;
cin>>n>>q;
fr(i, 0, n) cin>>v[i];
mpi mp;
int num=0;
fr(i, 0, n) { // compression
if( mp.find( v[i] ) != mp.end() ) {
v[i] = mp[ v[i] ];
}
else {
num++;
mp[ v[i] ] = num;
v[i] = num;
}
}
fr(i, 0, q) {
int l, r; cin>>l>>r;
l--;
r--;
Q.pb( {l, r, i} );
}
vi ans = mo_s( Q );
fr(i, 0, q) cout<<ans[i]<<e;
}
//cout<<"Case "<<tc++<<": "<<ans<<e;
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNpbmNsdWRlPGV4dC9wYl9kcy9hc3NvY19jb250YWluZXIuaHBwPgojaW5jbHVkZTxleHQvcGJfZHMvdHJlZV9wb2xpY3kuaHBwPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwp1c2luZyBuYW1lc3BhY2UgX19nbnVfcGJkczsKIAp0eXBlZGVmIGxvbmcgbG9uZyBsbDsKdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgdWxsOwogCnR5cGVkZWYgdmVjdG9yPGludD4gdmk7CnR5cGVkZWYgdmVjdG9yPGxsPiB2bGw7CnR5cGVkZWYgdmVjdG9yPHZpPiB2dmk7CnR5cGVkZWYgdmVjdG9yPHZsbD4gdnZsbDsKdHlwZWRlZiB2ZWN0b3I8c3RyaW5nPiB2czsKdHlwZWRlZiBwYWlyPGludCwgaW50PiBwaTsKdHlwZWRlZiBwYWlyPGxsLCBsbD4gcGxsOwp0eXBlZGVmIHZlY3RvcjxwYWlyPGludCwgaW50Pj4gdnBpOwp0eXBlZGVmIHZlY3RvcjxwYWlyPGxsLCBsbD4+IHZwbGw7CnR5cGVkZWYgc2V0PGludD4gc2k7CnR5cGVkZWYgc2V0PGxsPiBzbGw7CnR5cGVkZWYgc2V0PHBhaXI8aW50LCBpbnQ+PiBzcGk7CnR5cGVkZWYgc2V0PHBhaXI8bGwsIGxsPj4gc3BsbDsKdHlwZWRlZiBtdWx0aXNldDxpbnQ+IG1zaTsKdHlwZWRlZiBtdWx0aXNldDxsbD4gbXNsbDsKdHlwZWRlZiBtdWx0aXNldDxwYWlyPGludCwgaW50Pj4gbXNwaTsKdHlwZWRlZiBtdWx0aXNldDxwYWlyPGxsLCBsbD4+IG1zcGxsOwp0eXBlZGVmIG1hcDxpbnQsIGludD4gbXBpOwp0eXBlZGVmIG1hcDxsbCwgbGw+IG1wbGw7CiAKdHlwZWRlZiB0cmVlPGxsLCBudWxsX3R5cGUsIGxlc3M8bGw+LCByYl90cmVlX3RhZywgdHJlZV9vcmRlcl9zdGF0aXN0aWNzX25vZGVfdXBkYXRlPiBvcmRlcmVkX3NldDsgIC8vIGZpbmRfYnlfb3JkZXIsIG9yZGVyX29mX2tleSwgbGVzcywgZ3JlYXRlcixsZXNzX2VxdWFsCnR5cGVkZWYgdHJlZTxsbCwgbnVsbF90eXBlLCBsZXNzX2VxdWFsPGxsPiwgcmJfdHJlZV90YWcsIHRyZWVfb3JkZXJfc3RhdGlzdGljc19ub2RlX3VwZGF0ZT4gb3JkZXJlZF9tdWx0aXNldDsKIAojaW5jbHVkZTxpb21hbmlwPgojZGVmaW5lIGZhc3RpbyAgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7Y2luLnRpZShOVUxMKTtjb3V0LnRpZShOVUxMKTsKI2RlZmluZSBlICAgICJcbiIKI2RlZmluZSB5ZXMgY291dDw8IlllcyI8PGU7CiNkZWZpbmUgbm8gY291dDw8Ik5vIjw8ZTsKI2RlZmluZSBwYiAgIHB1c2hfYmFjawojZGVmaW5lIGZmICAgICBmaXJzdAojZGVmaW5lIHNzICAgIHNlY29uZAojZGVmaW5lIHN6ICAgIHNpemUoKQojZGVmaW5lIG1vZCAxMDAwMDAwMDA3ICAvLzFlOSs3ICAxMDAwMDAwMDA3IDk5ODI0NDM1MwojZGVmaW5lIGZyKGksYSxiKSBmb3IobGwgaT1hO2k8YjtpKyspCiNkZWZpbmUgZnIyKGksYSxiKSBmb3IobGwgaT1hO2k+PWI7aS0tKQojZGVmaW5lIGNvdXR2KHYpIGZvcihhdXRvIGl0OnYpY291dDw8aXQ8PCcgJztjb3V0PDxlCiNkZWZpbmUgY2ludih2KSBmb3IoYXV0byAmaXQ6diljaW4+Pml0CiNkZWZpbmUgYWxsKGEpIGEuYmVnaW4oKSxhLmVuZCgpCiNkZWZpbmUgcmFsbChhKSBhLnJiZWdpbigpLGEucmVuZCgpCiNkZWZpbmUgQ2VpbCh4LHkpICAoKHgreS0xKS95KQojZGVmaW5lIElORiAoMUxMPDw2MikKIAojZGVmaW5lIHJlYWQgICAgZnJlb3BlbigiYmluYXJ5LmluIiwiciIsc3RkaW4pCiNkZWZpbmUgd3JpdGUgICBmcmVvcGVuKCJjcmlja2V0Lm91dCIsInciLHN0ZG91dCkKIApjb25zdCBkb3VibGUgUEkgPSBhY29zKC0xKTsKY29uc3QgbGwgaW5mbGwgPSBMTE9OR19NQVg7CmNvbnN0IGxsIG1uID0gTExPTkdfTUlOOwpjb25zdCBpbnQgaW5mID0gSU5UX01BWDsKIApib29sIGNtcDEocGFpcjxsbCwgbGw+IHgxLCBwYWlyPGxsLCBsbD4geDIpIHsKICAgIHJldHVybiB4MS5zcyA8IHgyLnNzOwp9CiAKYm9vbCBjbXAyKHBhaXI8bGwsIGxsPiB4MSwgcGFpcjxsbCwgbGw+IHgyKSB7CiAgICBpZiAoIHgxLmZmID09IHgyLmZmICkgcmV0dXJuIHgxLnNzIDwgeDIuc3M7CiAgICByZXR1cm4geDEuZmYgPCB4Mi5mZjsKfQpib29sIGNtcDMocGFpcjxsbCwgbGw+IHgxLCBwYWlyPGxsLCBsbD4geDIpIHsKICAgIGlmICggeDEuZmYgPT0geDIuZmYgKSByZXR1cm4geDEuc3MgPiB4Mi5zczsKICAgIHJldHVybiB4MS5mZiA+IHgyLmZmOwp9CiAKdm9pZCBzb2x2ZSgpIHsKIAp9CiAKaW50IGJsb2NrX3NpemUgPSA0NDc7IC8vZm9yIDJlNQppbnQgbiwgcTsKIApzdHJ1Y3QgUXVlcnkgewogICAgaW50IGwsIHIsIGlkeDsKICAgIGJvb2wgb3BlcmF0b3I8KFF1ZXJ5IG90aGVyKSBjb25zdAogICAgewogICAgICAgIHJldHVybiBtYWtlX3BhaXIobCAvIGJsb2NrX3NpemUsIHIpIDwKICAgICAgICAgICAgICAgbWFrZV9wYWlyKG90aGVyLmwgLyBibG9ja19zaXplLCBvdGhlci5yKTsKICAgIH0KfTsKIAp2ZWN0b3I8UXVlcnk+IFE7CnZpIHYoMjAwMDA1LCAwKTsKdmkgZnJlcSgyMDAwMDUsIDApOwppbnQgY250PTA7CiAKdm9pZCByZW0oaW50IGlkeCkgeyAgLy8gVE9ETzogcmVtb3ZlIHZhbHVlIGF0IGlkeCBmcm9tIGRhdGEgc3RydWN0dXJlCiAgICBmcmVxWyB2W2lkeF0gXS0tOwogICAgaWYoIGZyZXFbIHZbaWR4XSBdID09IDAgKSBjbnQtLTsKfQp2b2lkIGFkZChpbnQgaWR4KSB7ICAvLyBUT0RPOiBhZGQgdmFsdWUgYXQgaWR4IGZyb20gZGF0YSBzdHJ1Y3R1cmUKICAgIGZyZXFbIHZbaWR4XSBdKys7CiAgICBpZiggZnJlcVsgdltpZHhdIF0gPT0gMSApIGNudCsrOwp9CmxsIGdldF9hbnN3ZXIoaW50IHZhbCkgeyAgICAgIC8vIFRPRE86IGV4dHJhY3QgdGhlIGN1cnJlbnQgYW5zd2VyIG9mIHRoZSBkYXRhIHN0cnVjdHVyZQogICAgcmV0dXJuIHZhbDsKfQogCnZlY3RvcjxpbnQ+IG1vX3ModmVjdG9yPFF1ZXJ5PiYgcXVlcmllcykgewogICAgdmVjdG9yPGludD4gYW5zd2VycyggKGludClxdWVyaWVzLnNpemUoKSk7CiAgICBzb3J0KHF1ZXJpZXMuYmVnaW4oKSwgcXVlcmllcy5lbmQoKSk7CiAKICAgIC8vIFRPRE86IGluaXRpYWxpemUgZGF0YSBzdHJ1Y3R1cmUKIAogICAgaW50IGN1cl9sID0gMDsKICAgIGludCBjdXJfciA9IC0xOyAvLyBiZWNhdXNlIG9mIHF1ZXJ5IFswLCAwXQogICAgLy8gaW52YXJpYW50OiBkYXRhIHN0cnVjdHVyZSB3aWxsIGFsd2F5cyByZWZsZWN0IHRoZSByYW5nZSBbY3VyX2wsIGN1cl9yXQogICAgZm9yIChRdWVyeSBxIDogcXVlcmllcykgewogICAgICAgIHdoaWxlIChjdXJfbCA+IHEubCkgewogICAgICAgICAgICBjdXJfbC0tOwogICAgICAgICAgICBhZGQoY3VyX2wpOwogICAgICAgIH0KICAgICAgICB3aGlsZSAoY3VyX3IgPCBxLnIpIHsKICAgICAgICAgICAgY3VyX3IrKzsKICAgICAgICAgICAgYWRkKGN1cl9yKTsKICAgICAgICB9CiAgICAgICAgd2hpbGUgKGN1cl9sIDwgcS5sKSB7CiAgICAgICAgICAgIHJlbShjdXJfbCk7CiAgICAgICAgICAgIGN1cl9sKys7CiAgICAgICAgfQogICAgICAgIHdoaWxlIChjdXJfciA+IHEucikgewogICAgICAgICAgICByZW0oY3VyX3IpOwogICAgICAgICAgICBjdXJfci0tOwogICAgICAgIH0KICAgICAgICBhbnN3ZXJzW3EuaWR4XSA9IGdldF9hbnN3ZXIoY250KTsKICAgIH0KICAgIHJldHVybiBhbnN3ZXJzOwp9CiAKaW50IG1haW4oKSB7CiAgICBmYXN0aW8KICAgIGludCB0ID0gMSwgdGMgPSAxOwogICAgLy9jaW4gPj4gdDsKIAogICAgd2hpbGUgKCB0LS0gKSB7CiAgICAgICAgLy9sbCBuOwogICAgICAgIGNpbj4+bj4+cTsKICAgICAgICBmcihpLCAwLCBuKSBjaW4+PnZbaV07CiAKICAgICAgICBtcGkgbXA7CiAgICAgICAgaW50IG51bT0wOwogICAgICAgIGZyKGksIDAsIG4pIHsgIC8vIGNvbXByZXNzaW9uCiAgICAgICAgICAgIGlmKCBtcC5maW5kKCB2W2ldICkgIT0gbXAuZW5kKCkgKSB7CiAgICAgICAgICAgICAgICB2W2ldID0gbXBbIHZbaV0gXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIG51bSsrOwogICAgICAgICAgICAgICAgbXBbIHZbaV0gXSA9IG51bTsKICAgICAgICAgICAgICAgIHZbaV0gPSBudW07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAKIAogICAgICAgIGZyKGksIDAsIHEpIHsKICAgICAgICAgICAgaW50IGwsIHI7IGNpbj4+bD4+cjsKICAgICAgICAgICAgbC0tOwogICAgICAgICAgICByLS07CiAgICAgICAgICAgIFEucGIoIHtsLCByLCBpfSApOwogICAgICAgIH0KIAogICAgICAgIHZpIGFucyA9IG1vX3MoIFEgKTsKICAgICAgICBmcihpLCAwLCBxKSBjb3V0PDxhbnNbaV08PGU7CiAKICAgIH0KIAogCiAgICAvL2NvdXQ8PCJDYXNlICI8PHRjKys8PCI6ICI8PGFuczw8ZTsKIAogICAgcmV0dXJuIDA7Cn0K