ll Q(const int &l,const int &r){
if(col[l]==col[r]){
ll ans=suf[l];
if(r!=br[col[l]])ans-=suf[r+1];
for(int i=1,pc=0;i<=br[col[l]]-bl[col[l]]+1;i++){
ans-=(l<=as[col[l]][i]&&as[col[l]][i]<=r)?(pc):(0);
pc+=(r<as[col[l]][i])?(1):(0);
}
return ans;
}
ll ans=suf[l]+pre[r]+res[col[l]+1][col[r]-1];
rep(i,l,br[col[l]])ans+=cnt[col[r]-1][a[i]]-cnt[col[l]][a[i]];
rep(i,bl[col[r]],r)ans+=br[col[r]-1]-bl[col[l]+1]+1-cnt[col[r]-1][a[i]]+cnt[col[l]][a[i]];
for(int i=1,j=1,pc=0;i<=br[col[l]]-bl[col[l]]+1;i++){
while(j<=br[col[r]]-bl[col[r]]+1&&a[as[col[l]][i]]>=a[as[col[r]][j]]){
pc+=(as[col[r]][j]<=r)?(1):(0);
j++;
}
ans+=(l<=as[col[l]][i])?(pc):(0);
}
return ans;
}
ll Q(const int &l,const int &r){
int pll=bl[col[l]],plr=bl[col[r]],prl=br[col[l]],prr=br[col[r]];
if(col[l]==col[r]){
ll ans=suf[l];
if(r!=prl)ans-=suf[r+1];
for(int i=1,pc=0;i<=prl-pll+1;i++){
ans-=(l<=as[col[l]][i]&&as[col[l]][i]<=r)?(pc):(0);
pc+=(r<as[col[l]][i])?(1):(0);
}
return ans;
}
ll ans=suf[l]+pre[r]+res[col[l]+1][col[r]-1];
rep(i,l,prl)ans+=cnt[col[r]-1][a[i]]-cnt[col[l]][a[i]];
rep(i,plr,r)ans+=br[col[r]-1]-bl[col[l]+1]+1-cnt[col[r]-1][a[i]]+cnt[col[l]][a[i]];
for(int i=1,j=1,pc=0;i<=prl-pll+1;i++){
while(j<=prr-plr+1&&a[as[col[l]][i]]>=a[as[col[r]][j]]){
pc+=(as[col[r]][j]<=r)?(1):(0);
j++;
}
ans+=(l<=as[col[l]][i])?(pc):(0);
}
return ans;
}
下面比上面跑得快,大概是因为访问内存比较慢?