#include #define ff first #define ss second #define pb push_back using namespace std; typedef long long ll; typedef pair pii; const int mod=998244353; inline int add(int x,int y){int ret=x+y;if(ret>=mod)ret-=mod;return ret;} inline int sub(int x,int y){int ret=x-y;if(ret<0)ret+=mod;return ret;} inline int mul(int x,int y){return ((ll)x*y)%mod;} inline int step(int base,int pw){int ret=1;while(pw){if(pw&1)ret=mul(ret,base);base=mul(base,base);pw>>=1;}return ret;} inline int invv(int x){return step(x,mod-2);} inline char gc() { // like getchar() static char buf[1 << 16]; static size_t bc, be; if (bc >= be) { buf[0] = 0, bc = 0; be = fread(buf, 1, sizeof(buf), stdin); } return buf[bc++]; // returns 0 on EOF } int readInt() { int a, c; while ((a = gc()) < 40); if (a == '-') return -readInt(); while ((c = gc()) >= 48) a = a * 10 + c - 480; return a - 48; } const int maxn=3e5+10; int n,q,a[maxn]; vectorvect[maxn],g[maxn],opens[maxn],closes[maxn],cand[maxn]; vectorqrys[maxn]; int pos[maxn],nstart[maxn],nend[maxn],ctm,rez[maxn]; int tree[maxn*4]; void dfs(int x){ nstart[x]=++ctm; for(int i=0;ievents; for(int i=1;i<=n;i++){ int sz=vect[i].size(); for(int j=sz-2;j>0;j--){ opens[vect[i][j-1]+1].pb(vect[i][j+1]); closes[vect[i][j]+1].pb(vect[i][j+1]); } } multisetst; for(int i=1;i<=n;i++){ for(int j=0;jrp || r=lp && r<=rp){ tree[x]+=val; return; } push(x); int mid=(l+r)/2; upd(x*2,l,mid,lp,rp,val); upd(x*2+1,mid+1,r,lp,rp,val); } int main(){ freopen("matchingseq.in","r",stdin); freopen("matchingseq.out","w",stdout); n=readInt(); q=readInt(); for(int i=1;i<=n;i++)vect[i].pb(0); for(int i=1;i<=n;i++){ a[i]=readInt(); vect[a[i]].pb(i); } prek(); for(int i=1;i<=q;i++){ int l,r; l=readInt(); r=readInt(); qrys[r].pb({l,i}); } for(int i=1;i<=n;i++){ for(int j=0;j