萌新求助卡常
查看原帖
萌新求助卡常
166814
c20210623楼主2022/1/22 16:38
#include<cstdio>
#include<cmath>
#include<cctype>
#include<algorithm>
using namespace std;
const int N=1e5+5,M=405;
int dd[M][M][M],da1[M][N][2],n,m,a[N],qs,qc,be[M],en[M],nq[N],px[N],lx[2][N];
long long da[M][M];
class istream{
    char buf[13000003],*s;
    public:
        inline istream(){
            buf[fread(s=buf,1,13000001,stdin)]='\n';
        }
        template<typename T>
        inline void operator>>(T&rhs){
            for(rhs=0;!isdigit(*s);++s);
            while(isdigit(*s))rhs=rhs*10+(*s++&15);
		}
}in;
struct ostream{
    char buf[8000005],*s;
    inline ostream(){s=buf;}
    inline void operator<<(long long d){
        if(!d){
            *s++='0';
        }else{
            static long long w;
            for(w=1;w<=d;w*=10);
            for(;w/=10;d%=w)*s++=d/w^'0';
        }
        *s++='\n';
    }
    inline ostream&operator<<(const char&c){*s++=c;return*this;}
    inline~ostream(){fwrite(buf,1,s-buf,stdout);}
}out;
//0-> >  1->
long long mer(int *l,int *r,int le1,int le2){
	int l1=1,r1=1;
	long long ans=0;
	while(l1<=le1 && r1<=le2){
		if(l[l1]>r[r1]){
			ans+=le1-l1+1;
			r1++;
		}
		else l1++;
	}
	return ans;
}
inline int d(int i,int j,int k,int v){
	return da1[j][k][v]-da1[i-1][k][v];
}
bool cmp(int A,int B){
	return a[A]<a[B];
}
int main(){
	in>>n;
	in>>m;
	qc=sqrt(n);
	qs=(n+qc-1)/qc;
	for(int i=1;i<=n;i++){
		in>>a[i];
		nq[i]=(i+qc-1)/qc;
		px[i]=i;
	}
	for(int i=1;i<=qs;i++){
		be[i]=(i-1)*qc+1;
		en[i]=be[i]+qc-1;
	}
	en[qs]=n;
	for(int i=1;i<=qs;i++) sort(px+be[i],px+en[i]+1,cmp);
	for(int i=1;i<=qs;i++){
		for(int le=2;le<=en[i]-be[i]+1;le++){
			for(int l=be[i];l<=en[i]-le+1;l++){
				int r=l+le-1,l1=l-be[i],r1=r-be[i];
				dd[i][l1][r1]=dd[i][l1][r1-1]+dd[i][l1+1][r1]-dd[i][l1+1][r1-1]+(a[l]>a[r]);
			}
		}
		for(int j=be[i];j<=en[i];j++){
			da1[i][a[j]-1][0]++; 
			da1[i][a[j]+1][1]++;
		}
		da[i][i]=dd[i][0][en[i]-be[i]];
		for(int j=n;j>=1;j--) da1[i][j][0]+=da1[i][j+1][0];
		for(int j=1;j<=n;j++) da1[i][j][1]+=da1[i][j-1][1];
		for(int j=1;j<=n;j++) da1[i][j][0]+=da1[i-1][j][0],da1[i][j][1]+=da1[i-1][j][1];
	}
	for(int le=2;le<=qs;le++){
		for(int l=1;l<=qs-le+1;l++){
			int r=le+l-1;
			da[l][r]=da[l][r-1]+da[r][r];
			for(int i=be[r];i<=en[r];i++) da[l][r]+=d(l,r-1,a[i],0);
		}
	}
	long long ans=0;
	while(m--){
		long long l,r;
		in>>l;
		in>>r;
		l^=ans;
		r^=ans;
		ans=0;
		if(nq[l]==nq[r]){
			ans=dd[nq[l]][l-be[nq[l]]][r-be[nq[l]]];
			out<<ans;
			continue;
		}
		ans=da[nq[l]+1][nq[r]-1]+
		dd[nq[l]][l-be[nq[l]]][en[nq[l]]-be[nq[l]]]+dd[nq[r]][0][r-be[nq[r]]];
		for(int i=l;i<=en[nq[l]];i++) ans+=d(nq[l]+1,nq[r]-1,a[i],1);
		for(int i=be[nq[r]];i<=r;i++) ans+=d(nq[l]+1,nq[r]-1,a[i],0);
		lx[0][0]=lx[1][0]=0;
		for(int i=be[nq[l]];i<=en[nq[l]];i++) if(px[i]>=l) lx[0][++lx[0][0]]=a[px[i]];
		for(int i=be[nq[r]];i<=en[nq[r]];i++) if(px[i]<=r) lx[1][++lx[1][0]]=a[px[i]];
		ans+=mer(lx[0],lx[1],lx[0][0],lx[1][0]);
		out<<ans;
	}
	return 0;
}
2022/1/22 16:38
加载中...