P5047调了一晚上还是不对,连样例都没过。。
主函数部分是正确的,玄关求条
#include<bits/stdc++.h>
#define int long long
#define N 100005
#define gc getchar()
#define rd read()
using namespace std;
inline int read()
{
unsigned register 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;
}
int n,m,a[N],A[N],bl,blv[N];
int ls[N],rs[N],ans[N];
struct node{int l,r,id,x;};
vector<node> cl[N],cr[N];
struct BIT
{
int c[N];
void add(int x,int y){while(x<=n)c[x]+=y,x+=(x&-x);}
int sum(int x){int s=0;while(x)s+=c[x],x^=(x&-x);return s;}
void clear(){memset(c,0,sizeof(c));}
}t1;
struct kuai
{
int c[N],s[1000];
void add1(int x){for(int i=blv[x]+1;i<=blv[n];i++)s[i]++;for(int i=x;blv[x]==blv[i]&&i<=n;i++)c[i]++;}
void add2(int x){for(int i=1;i<=blv[x]-1;i++)s[i]++;for(int i=x;blv[x]==blv[i]&&i>=1;i--)c[i]++;}
int sum(int x){return c[x]+s[blv[x]];}
void clear(){memset(c,0,sizeof(c));memset(s,0,sizeof(s));}
}t2;
struct qur{int l,r,id;}q[N];
bool operator<(const qur x,const qur y)
{
int a=x.l/bl,b=y.l/bl;
return (a!=b?a<b:(x.r<y.r));
}
void init()
{
sort(A+1,A+n+1);
register int s=unique(A+1,A+n+1)-A-1;
for(register int i=1;i<=n;i++)a[i]=lower_bound(A+1,A+s+1,a[i])-A;
sort(q+1,q+m+1);
for(int i=1;i<=n;i++)ls[i]=ls[i-1]+t1.sum(n)-t1.sum(a[i]),t1.add(a[i],1);
t1.clear();
for(int i=n;i>=1;i--)rs[i]=rs[i+1]+t1.sum(a[i]-1),t1.add(a[i],1);
}
void solve()
{
for(int i=1;i<=n;i++)
{
t2.add2(a[i]-1);
for(auto j:cl[i])
{
int l=j.l,r=j.r,id=j.id,is=j.x,sumv=0;
for(int k=l;k<=r;k++)sumv+=t2.sum(a[k]);
if(is)ans[id]+=sumv;
else ans[id]-=sumv;
}
}
t2.clear();
for(int i=n;i>=1;i--)
{
t2.add1(a[i]+1);
for(auto j:cr[i])
{
int l=j.l,r=j.r,id=j.id,is=j.x,sumv=0;
for(int k=l;k<=r;k++)sumv+=t2.sum(a[k]);
if(is)ans[id]+=sumv;
else ans[id]-=sumv;
}
}
exit(0);
}
signed main()
{
// freopen("P5047_1.in","r",stdin);
// freopen("out.out","w",stdout);
n=rd,m=rd;bl=sqrt(n);
for(int i=1;i<=n;i++)A[i]=a[i]=rd;
for(int i=1;i<=n;i++)blv[i]=(i-1)/bl+1;
for(int i=1;i<=m;i++)q[i]={rd,rd,i};
init();
for(int l=1,r=0,i=1;i<=m;i++)
{
int L=q[i].l,R=q[i].r,ID=q[i].id;
if(r<R)cl[l-1].push_back({r+1,R,ID,0});
if(r>R)cl[l-1].push_back({R+1,r,ID,1});
if(l>L)cr[r+1].push_back({L,l-1,ID,0});
if(l<L)cr[r+1].push_back({l,L-1,ID,1});
ans[ID]+=ls[R]-ls[r];ans[ID]+=rs[L]-rs[l];
l=L,r=R;
}
solve();
for(int i=1;i<=m;i++)ans[q[i].id]+=ans[q[i-1].id];
for(int i=1;i<=m;i++)cout<<ans[i]<<'\n';
return 0;
}