求助卡常
  • 板块灌水区
  • 楼主Eterna
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/12/31 12:32
  • 上次更新2024/12/31 20:14:19
查看原帖
求助卡常
1348260
Eterna楼主2024/12/31 12:32

#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#include<bits/stdc++.h>
#define N 100005
#define S 805
#define ll long long
#define rd read()
#define max(x,y) (x>y?x:y)
#define min(x,y) (x<y?x:y)
#define gc pa == pb && (pb = (pa = buf) + fread(buf, 1, 100000, stdin), pa == pb) ? EOF : *pa++
static char buf[100000], * pa(buf), * pb(buf);
inline unsigned int read()
{
	register unsigned int x=0,s=gc;
	while(s<'0'||s>'9')s=gc;
	while(s>='0'&&s<='9')x=(x<<1)+(x<<3)+(s^48),s=gc;
	return x;
}
struct ostream{
	char buf[9000005],*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);}
}cout;
struct pd
{
	int v,ps;
	inline bool operator <(const pd &o)const{return v<o.v;}
}p[N];
int n,q,a[N],block,tot,bl[N],L[S],R[S];
ll pre[N],nxt[N],last;
ll cnt[S][N],ans[S][S],c[N];
inline void add(register int x,const register int y){while(x<=n)c[x]+=y,x+=(x&-x);}
inline ll ak(register int x){register ll sum=0;while(x)sum+=c[x],x^=(x&-x);return sum;}
inline void init()
{
	ll sum=0;
	for(register int x(1);x<=tot;sum=0,++x)
	{
		L[x]=R[x-1]+1,R[x]=min(x*block,n);
		add(a[L[x]],1),cnt[x][a[L[x]]]=1;
		for(register int i=L[x]+1;i<=R[x];cnt[x][a[i]]=1,add(a[i++],1))pre[i]=pre[i-1]+(i-L[x])-ak(a[i]);
		for(register int i=L[x];i<=R[x];add(a[i++],-1));add(a[R[x]],1);
		for(register int i=R[x]-1;i>=L[x];add(a[i--],1))nxt[i]=nxt[i+1]+ak(a[i]);
		for(register int i=L[x];i<=R[x];add(a[i++],-1));
		for(register int i(1);i<=n;cnt[x][i]=sum+cnt[x-1][i],++i)sum+=cnt[x][i];
		ans[x][x]=pre[R[x]],std::sort(p+L[x],p+R[x]+1);
	}
}
inline ll calc(int l,int r,int l1,int r1,int l2,int r2)
{
	register int pos=L[r]-1;
	register ll sum=0,res=0;
	for(register int i=L[l];i<=R[l];++i)
		if(p[i].ps>=l1&&p[i].ps<=r1)
		{
			while(pos<=R[r]&&p[i].v>p[pos+1].v)
			{
				++pos;
				if(l2<=p[pos].ps&&p[pos].ps<=r2)++sum;
			}
			res+=sum;
		}
	return res;
}
int l,r;
inline void ask()
{
	const int b1=bl[l],b2=bl[r]; 
	if(b1==b2)
	{
		if(l==L[b1])last=pre[r];
		else last=pre[r]-pre[l-1]-calc(b1,b2,1,l-1,l,r);
		cout<<last;return;
	}
	ll res=nxt[l]+pre[r]+ans[b1+1][b2-1]+calc(b1,b2,l,R[b1],L[b2],r);
	for(register int i=l;bl[i]==b1;++i)res+=cnt[b2-1][a[i]]-cnt[b1][a[i]];
	for(register int i=L[b2];i<=r;++i)res+=cnt[b1][a[i]]-cnt[b2-1][a[i]];
	last=res+(r-L[b2]+1)*(R[b2-1]-L[b1+1]+1);
	cout<<last;
}
signed main()
{
	n=rd,q=rd,block=sqrt(n)/2+1,tot=n/block+(n%block?1:0);
	for(register int i(1);i<=n;bl[i]=(i-1)/block+1,p[i]={a[i]=rd,i},i++);
	init();
	for(register int i=2;i<=tot;++i)for(l=1,r=i;r<=tot;++l,++r)ans[l][r]=ans[l+1][r]+ans[l][r-1]-ans[l+1][r-1]+calc(l,r,L[l],R[l],L[r],R[r]);
	while(q--)l=rd^last,r=rd^last,ask();
	return 0;
}
/*
10 4
1 10 2 4 5 3 7 8 9 6
1 9
1 3
3 8
15 5
*/

前三个点过不去啊啊啊,T了大概90ms

2024/12/31 12:32
加载中...