#include<bits/stdc++.h>
using namespace std;
#define foru(i,a,b) for(int i=(a); i<=(b); ++i)
#define ford(i,a,b) for(int i=(a); i>=(b); --i)
#define rep(i,a) for(int i=0; i<(a); ++i)
#define sz(a) (int)(a).size()
#define all(a) (a).begin(),(a).end()
#define bit(s,i) (((s)>>(i))&1)
#define ii pair<int,int>
#define fi first
#define se second
#define pb push_back
#define eb emplace_back
#define ll long long
#define _ << " " <<
template <class X, class Y> bool maxi(X &x, Y y){return x<y?x=y,true:false;}
template <class X, class Y> bool mini(X &x, Y y){return x>y?x=y,true:false;}
const int N=606060;
int n,q,a[N],ql[N],qr[N],ans[N];
struct PST {
struct Node {
int l, r;
int mn;
Node(): l(0), r(0), mn(0) {}
};
int NVAL; // domain [1..NVAL]
vector<Node> seg;
vector<int> roots;
int clone(int id) {
seg.push_back(seg[id]);
return (int)seg.size()-1;
}
int build(int tl, int tr) {
int id = (int)seg.size();
seg.emplace_back();
if (tl == tr) {
seg[id].mn = 0;
} else {
int mid = (tl+tr)>>1;
seg[id].l = build(tl, mid);
seg[id].r = build(mid+1, tr);
seg[id].mn = 0;
}
return id;
}
int update(int prev_id, int tl, int tr, int pos, int val) {
int id = clone(prev_id);
if (tl == tr) {
seg[id].mn = val;
return id;
}
int mid = (tl+tr)>>1;
if (pos <= mid)
seg[id].l = update(seg[prev_id].l, tl, mid, pos, val);
else
seg[id].r = update(seg[prev_id].r, mid+1, tr, pos, val);
seg[id].mn = min(seg[seg[id].l].mn, seg[seg[id].r].mn);
return id;
}
int query_mex(int id, int tl, int tr, int threshold) {
if (seg[id].mn >= threshold) return -1;
if (tl == tr) return tl;
int mid = (tl+tr)>>1;
int res = query_mex(seg[id].l, tl, mid, threshold);
if (res != -1) return res;
return query_mex(seg[id].r, mid+1, tr, threshold);
}
void init(int n) {
NVAL = n+1;
seg.clear(); roots.clear();
seg.reserve((n+5) * 20);
roots.reserve(n+1);
int root0 = build(1, NVAL);
roots.push_back(root0);
}
void add_version(int val, int idx) {
int prev_root = roots.back();
int new_root = prev_root;
if (1 <= val && val <= NVAL) {
new_root = update(prev_root, 1, NVAL, val, idx);
}
roots.push_back(new_root);
}
int get_mex(int l, int r) {
if(l > r) return -1;
int ans = query_mex(roots[r], 1, NVAL, l);
if (ans == -1) ans = NVAL+1;
return ans;
}
} pst;
int mex[N],num[N],lst[N];
int pos[N],curMex=1;
priority_queue<ii> pq;
priority_queue<ii,vector<ii>,greater<ii>> pq2;
void dnc(int l, int r, const vector<int>& qry){
if(qry.empty()) return;
if(l>r){
assert(qry.empty());
return;
}
int m=(l+r)>>1;
// cout<<l _ r _ m<< '\n';
ford(i,m,l){
pos[a[i]]=i; if(a[i]<curMex) pq.push({pos[a[i]],a[i]});
while(pos[curMex]>0) pq.push({pos[curMex],curMex}), ++curMex;
while(pq.size() && pos[pq.top().se] != pq.top().fi) pq.pop();
mex[i]=curMex;
int tmp=pq.size() ? pq.top().fi+1 : i+1;
if(tmp<=m && mex[tmp]==mex[i]){
num[i]=num[tmp]+1;
lst[i]=lst[tmp];
} else{
num[i]=1;
lst[i]=tmp;
}
}
curMex=1;
foru(i,l,m) pos[a[i]]=0;
while(pq.size()) pq.pop();
foru(i,m+1,r){
pos[a[i]]=i; if(a[i]<curMex) pq2.push({pos[a[i]],a[i]});
while(pos[curMex]>0) pq2.push({pos[curMex],curMex}), ++curMex;
while(pq2.size() && pos[pq2.top().se] != pq2.top().fi) pq2.pop();
mex[i]=curMex;
int tmp=pq2.size() ? pq2.top().fi-1 : i-1;
if(tmp>=m+1 && mex[tmp]==mex[i]){
num[i]=num[tmp]+1;
lst[i]=lst[tmp];
} else{
num[i]=1;
lst[i]=tmp;
}
}
curMex=1;
foru(i,m+1,r) pos[a[i]]=0;
while(pq2.size()) pq2.pop();
vector<int> qryl, qryr;
for(auto i:qry){
int tl=ql[i], tr=qr[i];
if(tr==m){
ans[i]=num[tl];
} else if(tr<m){
qryl.eb(i);
} else if(tl>=m+1){
qryr.eb(i);
} else{
int mexlr = pst.get_mex(tl,tr);
if(mexlr==mex[tl] && mexlr==mex[tr]){
ans[i]=num[tl]+num[tr]+(pst.get_mex(lst[tl],lst[tr]) == mexlr);
} else if(mexlr==mex[tl]){
ans[i]=num[tl]+(pst.get_mex(lst[tl],tr) == mexlr);
} else if(mexlr==mex[tr]){
ans[i]=num[tr]+(pst.get_mex(tl,lst[tr]) == mexlr);
} else{
ans[i]=1;
}
}
}
dnc(l,m-1,qryl);
dnc(m+1,r,qryr);
}
void solve(){
cin>>n>>q;
pst.init(n);
foru(i,1,n) cin>>a[i], pst.add_version(a[i],i);
vector<int> qry;
foru(i,1,q){
cin>>ql[i]>>qr[i];
qry.eb(i);
}
dnc(1,n,qry);
foru(i,1,q) cout<<ans[i]<<'\n';
}
int32_t main(){
#define task "test"
if(fopen(task".inp","r")){
freopen(task".inp","r",stdin);
freopen(task".out","w",stdout);
}
cin.tie(0)->sync_with_stdio(0);
int tc=1; //cin>>tc;
rep(i,tc){
solve();
}
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCiNkZWZpbmUgZm9ydShpLGEsYikgZm9yKGludCBpPShhKTsgaTw9KGIpOyArK2kpCiNkZWZpbmUgZm9yZChpLGEsYikgZm9yKGludCBpPShhKTsgaT49KGIpOyAtLWkpCiNkZWZpbmUgcmVwKGksYSkgZm9yKGludCBpPTA7IGk8KGEpOyArK2kpCiNkZWZpbmUgc3ooYSkgKGludCkoYSkuc2l6ZSgpCiNkZWZpbmUgYWxsKGEpIChhKS5iZWdpbigpLChhKS5lbmQoKQojZGVmaW5lIGJpdChzLGkpICgoKHMpPj4oaSkpJjEpCiNkZWZpbmUgaWkgcGFpcjxpbnQsaW50PgojZGVmaW5lIGZpIGZpcnN0CiNkZWZpbmUgc2Ugc2Vjb25kCiNkZWZpbmUgcGIgcHVzaF9iYWNrCiNkZWZpbmUgZWIgZW1wbGFjZV9iYWNrCiNkZWZpbmUgbGwgbG9uZyBsb25nCiNkZWZpbmUgXyA8PCAiICIgPDwKCnRlbXBsYXRlIDxjbGFzcyBYLCBjbGFzcyBZPiBib29sIG1heGkoWCAmeCwgWSB5KXtyZXR1cm4geDx5P3g9eSx0cnVlOmZhbHNlO30KdGVtcGxhdGUgPGNsYXNzIFgsIGNsYXNzIFk+IGJvb2wgbWluaShYICZ4LCBZIHkpe3JldHVybiB4Pnk/eD15LHRydWU6ZmFsc2U7fQoKY29uc3QgaW50IE49NjA2MDYwOwoKaW50IG4scSxhW05dLHFsW05dLHFyW05dLGFuc1tOXTsKCnN0cnVjdCBQU1QgewogICAgc3RydWN0IE5vZGUgewogICAgICAgIGludCBsLCByOwogICAgICAgIGludCBtbjsKICAgICAgICBOb2RlKCk6IGwoMCksIHIoMCksIG1uKDApIHt9CiAgICB9OwoKICAgIGludCBOVkFMOyAvLyBkb21haW4gWzEuLk5WQUxdCiAgICB2ZWN0b3I8Tm9kZT4gc2VnOwogICAgdmVjdG9yPGludD4gcm9vdHM7CgogICAgaW50IGNsb25lKGludCBpZCkgewogICAgICAgIHNlZy5wdXNoX2JhY2soc2VnW2lkXSk7CiAgICAgICAgcmV0dXJuIChpbnQpc2VnLnNpemUoKS0xOwogICAgfQoKICAgIGludCBidWlsZChpbnQgdGwsIGludCB0cikgewogICAgICAgIGludCBpZCA9IChpbnQpc2VnLnNpemUoKTsKICAgICAgICBzZWcuZW1wbGFjZV9iYWNrKCk7CiAgICAgICAgaWYgKHRsID09IHRyKSB7CiAgICAgICAgICAgIHNlZ1tpZF0ubW4gPSAwOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGludCBtaWQgPSAodGwrdHIpPj4xOwogICAgICAgICAgICBzZWdbaWRdLmwgPSBidWlsZCh0bCwgbWlkKTsKICAgICAgICAgICAgc2VnW2lkXS5yID0gYnVpbGQobWlkKzEsIHRyKTsKICAgICAgICAgICAgc2VnW2lkXS5tbiA9IDA7CiAgICAgICAgfQogICAgICAgIHJldHVybiBpZDsKICAgIH0KCiAgICBpbnQgdXBkYXRlKGludCBwcmV2X2lkLCBpbnQgdGwsIGludCB0ciwgaW50IHBvcywgaW50IHZhbCkgewogICAgICAgIGludCBpZCA9IGNsb25lKHByZXZfaWQpOwogICAgICAgIGlmICh0bCA9PSB0cikgewogICAgICAgICAgICBzZWdbaWRdLm1uID0gdmFsOwogICAgICAgICAgICByZXR1cm4gaWQ7CiAgICAgICAgfQogICAgICAgIGludCBtaWQgPSAodGwrdHIpPj4xOwogICAgICAgIGlmIChwb3MgPD0gbWlkKQogICAgICAgICAgICBzZWdbaWRdLmwgPSB1cGRhdGUoc2VnW3ByZXZfaWRdLmwsIHRsLCBtaWQsIHBvcywgdmFsKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIHNlZ1tpZF0uciA9IHVwZGF0ZShzZWdbcHJldl9pZF0uciwgbWlkKzEsIHRyLCBwb3MsIHZhbCk7CiAgICAgICAgc2VnW2lkXS5tbiA9IG1pbihzZWdbc2VnW2lkXS5sXS5tbiwgc2VnW3NlZ1tpZF0ucl0ubW4pOwogICAgICAgIHJldHVybiBpZDsKICAgIH0KCiAgICBpbnQgcXVlcnlfbWV4KGludCBpZCwgaW50IHRsLCBpbnQgdHIsIGludCB0aHJlc2hvbGQpIHsKICAgICAgICBpZiAoc2VnW2lkXS5tbiA+PSB0aHJlc2hvbGQpIHJldHVybiAtMTsKICAgICAgICBpZiAodGwgPT0gdHIpIHJldHVybiB0bDsKICAgICAgICBpbnQgbWlkID0gKHRsK3RyKT4+MTsKICAgICAgICBpbnQgcmVzID0gcXVlcnlfbWV4KHNlZ1tpZF0ubCwgdGwsIG1pZCwgdGhyZXNob2xkKTsKICAgICAgICBpZiAocmVzICE9IC0xKSByZXR1cm4gcmVzOwogICAgICAgIHJldHVybiBxdWVyeV9tZXgoc2VnW2lkXS5yLCBtaWQrMSwgdHIsIHRocmVzaG9sZCk7CiAgICB9CgogICAgdm9pZCBpbml0KGludCBuKSB7CiAgICAgICAgTlZBTCA9IG4rMTsKICAgICAgICBzZWcuY2xlYXIoKTsgcm9vdHMuY2xlYXIoKTsKICAgICAgICBzZWcucmVzZXJ2ZSgobis1KSAqIDIwKTsKICAgICAgICByb290cy5yZXNlcnZlKG4rMSk7CiAgICAgICAgaW50IHJvb3QwID0gYnVpbGQoMSwgTlZBTCk7CiAgICAgICAgcm9vdHMucHVzaF9iYWNrKHJvb3QwKTsKICAgIH0KCiAgICB2b2lkIGFkZF92ZXJzaW9uKGludCB2YWwsIGludCBpZHgpIHsKICAgICAgICBpbnQgcHJldl9yb290ID0gcm9vdHMuYmFjaygpOwogICAgICAgIGludCBuZXdfcm9vdCA9IHByZXZfcm9vdDsKICAgICAgICBpZiAoMSA8PSB2YWwgJiYgdmFsIDw9IE5WQUwpIHsKICAgICAgICAgICAgbmV3X3Jvb3QgPSB1cGRhdGUocHJldl9yb290LCAxLCBOVkFMLCB2YWwsIGlkeCk7CiAgICAgICAgfQogICAgICAgIHJvb3RzLnB1c2hfYmFjayhuZXdfcm9vdCk7CiAgICB9CgogICAgaW50IGdldF9tZXgoaW50IGwsIGludCByKSB7CiAgICAgICAgaWYobCA+IHIpIHJldHVybiAtMTsKICAgICAgICBpbnQgYW5zID0gcXVlcnlfbWV4KHJvb3RzW3JdLCAxLCBOVkFMLCBsKTsKICAgICAgICBpZiAoYW5zID09IC0xKSBhbnMgPSBOVkFMKzE7CiAgICAgICAgcmV0dXJuIGFuczsKICAgIH0KfSBwc3Q7CgppbnQgbWV4W05dLG51bVtOXSxsc3RbTl07CmludCBwb3NbTl0sY3VyTWV4PTE7CnByaW9yaXR5X3F1ZXVlPGlpPiBwcTsKcHJpb3JpdHlfcXVldWU8aWksdmVjdG9yPGlpPixncmVhdGVyPGlpPj4gcHEyOwoKdm9pZCBkbmMoaW50IGwsIGludCByLCBjb25zdCB2ZWN0b3I8aW50PiYgcXJ5KXsKICAgIGlmKHFyeS5lbXB0eSgpKSByZXR1cm47CiAgICBpZihsPnIpewogICAgICAgIGFzc2VydChxcnkuZW1wdHkoKSk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGludCBtPShsK3IpPj4xOwovLyAgICBjb3V0PDxsIF8gciBfIG08PCAnXG4nOwogICAgZm9yZChpLG0sbCl7CiAgICAgICAgcG9zW2FbaV1dPWk7IGlmKGFbaV08Y3VyTWV4KSBwcS5wdXNoKHtwb3NbYVtpXV0sYVtpXX0pOwogICAgICAgIHdoaWxlKHBvc1tjdXJNZXhdPjApIHBxLnB1c2goe3Bvc1tjdXJNZXhdLGN1ck1leH0pLCArK2N1ck1leDsKICAgICAgICB3aGlsZShwcS5zaXplKCkgJiYgcG9zW3BxLnRvcCgpLnNlXSAhPSBwcS50b3AoKS5maSkgcHEucG9wKCk7CgogICAgICAgIG1leFtpXT1jdXJNZXg7CgogICAgICAgIGludCB0bXA9cHEuc2l6ZSgpID8gcHEudG9wKCkuZmkrMSA6IGkrMTsKICAgICAgICBpZih0bXA8PW0gJiYgbWV4W3RtcF09PW1leFtpXSl7CiAgICAgICAgICAgIG51bVtpXT1udW1bdG1wXSsxOwogICAgICAgICAgICBsc3RbaV09bHN0W3RtcF07CiAgICAgICAgfSBlbHNlewogICAgICAgICAgICBudW1baV09MTsKICAgICAgICAgICAgbHN0W2ldPXRtcDsKICAgICAgICB9CiAgICB9CiAgICBjdXJNZXg9MTsKICAgIGZvcnUoaSxsLG0pIHBvc1thW2ldXT0wOwogICAgd2hpbGUocHEuc2l6ZSgpKSBwcS5wb3AoKTsKCiAgICBmb3J1KGksbSsxLHIpewogICAgICAgIHBvc1thW2ldXT1pOyBpZihhW2ldPGN1ck1leCkgcHEyLnB1c2goe3Bvc1thW2ldXSxhW2ldfSk7CiAgICAgICAgd2hpbGUocG9zW2N1ck1leF0+MCkgcHEyLnB1c2goe3Bvc1tjdXJNZXhdLGN1ck1leH0pLCArK2N1ck1leDsKICAgICAgICB3aGlsZShwcTIuc2l6ZSgpICYmIHBvc1twcTIudG9wKCkuc2VdICE9IHBxMi50b3AoKS5maSkgcHEyLnBvcCgpOwoKICAgICAgICBtZXhbaV09Y3VyTWV4OwoKICAgICAgICBpbnQgdG1wPXBxMi5zaXplKCkgPyBwcTIudG9wKCkuZmktMSA6IGktMTsKICAgICAgICBpZih0bXA+PW0rMSAmJiBtZXhbdG1wXT09bWV4W2ldKXsKICAgICAgICAgICAgbnVtW2ldPW51bVt0bXBdKzE7CiAgICAgICAgICAgIGxzdFtpXT1sc3RbdG1wXTsKICAgICAgICB9IGVsc2V7CiAgICAgICAgICAgIG51bVtpXT0xOwogICAgICAgICAgICBsc3RbaV09dG1wOwogICAgICAgIH0KICAgIH0KICAgIGN1ck1leD0xOwogICAgZm9ydShpLG0rMSxyKSBwb3NbYVtpXV09MDsKICAgIHdoaWxlKHBxMi5zaXplKCkpIHBxMi5wb3AoKTsKCiAgICB2ZWN0b3I8aW50PiBxcnlsLCBxcnlyOwogICAgZm9yKGF1dG8gaTpxcnkpewogICAgICAgIGludCB0bD1xbFtpXSwgdHI9cXJbaV07CiAgICAgICAgaWYodHI9PW0pewogICAgICAgICAgICBhbnNbaV09bnVtW3RsXTsKICAgICAgICB9IGVsc2UgaWYodHI8bSl7CiAgICAgICAgICAgIHFyeWwuZWIoaSk7CiAgICAgICAgfSBlbHNlIGlmKHRsPj1tKzEpewogICAgICAgICAgICBxcnlyLmViKGkpOwogICAgICAgIH0gZWxzZXsKICAgICAgICAgICAgaW50IG1leGxyID0gcHN0LmdldF9tZXgodGwsdHIpOwogICAgICAgICAgICBpZihtZXhscj09bWV4W3RsXSAmJiBtZXhscj09bWV4W3RyXSl7CiAgICAgICAgICAgICAgICBhbnNbaV09bnVtW3RsXStudW1bdHJdKyhwc3QuZ2V0X21leChsc3RbdGxdLGxzdFt0cl0pID09IG1leGxyKTsKICAgICAgICAgICAgfSBlbHNlIGlmKG1leGxyPT1tZXhbdGxdKXsKICAgICAgICAgICAgICAgIGFuc1tpXT1udW1bdGxdKyhwc3QuZ2V0X21leChsc3RbdGxdLHRyKSA9PSBtZXhscik7CiAgICAgICAgICAgIH0gZWxzZSBpZihtZXhscj09bWV4W3RyXSl7CiAgICAgICAgICAgICAgICBhbnNbaV09bnVtW3RyXSsocHN0LmdldF9tZXgodGwsbHN0W3RyXSkgPT0gbWV4bHIpOwogICAgICAgICAgICB9IGVsc2V7CiAgICAgICAgICAgICAgICBhbnNbaV09MTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBkbmMobCxtLTEscXJ5bCk7CiAgICBkbmMobSsxLHIscXJ5cik7Cn0KCnZvaWQgc29sdmUoKXsKICAgIGNpbj4+bj4+cTsKCiAgICBwc3QuaW5pdChuKTsKICAgIGZvcnUoaSwxLG4pIGNpbj4+YVtpXSwgcHN0LmFkZF92ZXJzaW9uKGFbaV0saSk7CgogICAgdmVjdG9yPGludD4gcXJ5OwogICAgZm9ydShpLDEscSl7CiAgICAgICAgY2luPj5xbFtpXT4+cXJbaV07CiAgICAgICAgcXJ5LmViKGkpOwogICAgfQoKICAgIGRuYygxLG4scXJ5KTsKCiAgICBmb3J1KGksMSxxKSBjb3V0PDxhbnNbaV08PCdcbic7Cn0KCmludDMyX3QgbWFpbigpewogICAgI2RlZmluZSB0YXNrICJ0ZXN0IgogICAgaWYoZm9wZW4odGFzayIuaW5wIiwiciIpKXsKICAgICAgICBmcmVvcGVuKHRhc2siLmlucCIsInIiLHN0ZGluKTsKICAgICAgICBmcmVvcGVuKHRhc2siLm91dCIsInciLHN0ZG91dCk7CiAgICB9CiAgICBjaW4udGllKDApLT5zeW5jX3dpdGhfc3RkaW8oMCk7CgogICAgaW50IHRjPTE7IC8vY2luPj50YzsKICAgIHJlcChpLHRjKXsKICAgICAgICBzb2x2ZSgpOwogICAgfQp9Cg==