rt,大概是答案错误,样例能过
#include<bits/stdc++.h>
#define P pair<int,int>
#define ll long long
using namespace std;
const int N=1e5+2,M=201;
int n,m,a[N],bel[N],L[M],R[M];
int X[M],Y[M],tax[N],s[N]; P b[N];
int T[N],pre[N],suf[N],Pre[N],f[M][N],g[M][N];
ll ansL[M][N],ansR[M][N];
ll read() {
ll x=0; char c=0; while (!isdigit(c) ) c=getchar();
while (isdigit(c) ) x=(x<<3)+(x<<1)+(c&15),c=getchar();
return x;
}
void add(int x) { while (x<=n) T[x]++,x+=x&-x; }
int query(int x,int cnt=0) { while (x) cnt+=T[x],x&=x-1; return cnt; }
int merge(int *X,int *Y)
{
int ans=0;
for (int i=1,j=1;i<=X[0];i++) {
while (j<=Y[0]&&Y[j]<X[i]) j++;
ans+=j-1;
}
return ans;
}
ll Query(int l,int r)
{
X[0]=Y[0]=0;
if (bel[l]==bel[r]) {
if (l==L[bel[l] ]) return Pre[r];
for (int i=L[bel[l] ];i<=R[bel[l] ];i++)
if (b[i].second<l) X[++X[0] ]=b[i].first;
else if (b[i].second<=r) Y[++Y[0] ]=b[i].first;
return Pre[r]-Pre[l-1]-merge(X,Y);
}
for (int i=L[bel[l] ];i<=R[bel[l] ];i++) if (l<=b[i].second) X[++X[0] ]=b[i].first;
for (int i=L[bel[r] ];i<=R[bel[r] ];i++) if (b[i].second<=r) Y[++Y[0] ]=b[i].first;
return ansL[bel[r]-1][l]+ansR[bel[l]+1][r]-ansR[bel[l]+1][R[bel[r]-1] ]+merge(X,Y);
}
int main()
{
n=read(),m=read(); int block=500;
for (int i=1;i<=n;i++) a[i]=read(),b[i]={a[i],i},bel[i]=(i-1)/block+1;
for (int i=1;i<=n;i++) { if (!L[bel[i] ]) L[bel[i] ]=i; R[bel[i] ]=i; }
for (int i=1;i<=bel[n];i++) {
for (int j=L[i];j<=R[i];j++) tax[a[j] ]++;
for (int j=1;j<=n;j++) f[i][j]=f[i][j-1]+tax[j];
for (int j=n;j;j--) g[i][j]=g[i][j+1]+tax[j];
}
for (int i=1;i<=bel[n];i++) {
for (int j=L[i];j<=R[i];j++) pre[j]=j-L[i]-query(a[j]),add(a[j]);
for (int j=L[i]+1;j<=R[i];j++) Pre[j]=Pre[j-1]+pre[j];
for (int j=1;j<=n;j++) T[j]=0;
for (int j=R[i];j>=L[i];j--) suf[j]=query(a[j]),add(a[j]);
for (int j=1;j<=n;j++) T[j]=0;
}
for (int i=1;i<=bel[n];i++) for (int j=R[i];j;j--) ansL[i][j]=ansL[i][j+1]+f[i][a[j]-1]-f[bel[j] ][a[j]-1]+suf[j];
for (int i=1;i<=bel[n];i++) for (int j=L[i];j<=n;j++) ansR[i][j]=ansR[i][j-1]+g[bel[j]-1][a[j]+1]-g[i-1][a[j]+1]+pre[j];
for (int i=1;i<=bel[n];i++) sort(b+L[i],b+R[i]+1);
ll last=0;
while (m--) {
int x=read()^last,y=read()^last;
printf("%lld\n",last=Query(x,y) );
}
return 0;
}