树状数组套权值线段树,不知为何 RE。空间难道不是 O(nlogn) 的吗
#include<bits/stdc++.h>
#define N 200001
using namespace std;
int n,m,a[N],la[N],pos[N],ans1[N],ans2[N],lmt;
struct query{
int l,a,b,id;
};
vector<query>g[N];
struct bit_sgt{
int cnt,sgt[N*40],bit[N],ls[N*40],rs[N*40];
void clear(){
cnt=0;
memset(bit,0,sizeof bit);
memset(sgt,0,sizeof sgt);
memset(ls,0,sizeof ls);
memset(rs,0,sizeof rs);
}
void sgt_up(int x){
sgt[x]=0;
if(ls[x]){
sgt[x]+=sgt[ls[x]];
}
if(rs[x]){
sgt[x]+=sgt[rs[x]];
}
}
void sgt_mdf(int&x,int l,int r,int k,int v){
if(l>r){
return;
}
if(!x){
x=++cnt;
}
if(l^r){
int mid=(l+r)>>1;
if(k<=mid){
sgt_mdf(ls[x],l,mid,k,v);
}else{
sgt_mdf(rs[x],mid+1,r,k,v);
}
sgt_up(x);
}else{
sgt[x]+=v;
}
}
int sgt_qry(int x,int l,int r,int ql,int qr){
if(!x||l>r||ql>qr){
return 0;
}
if(ql<=l&&r<=qr){
return sgt[x];
}
int mid=(l+r)>>1,ret=0;
if(ql<=mid){
ret+=sgt_qry(ls[x],l,mid,ql,qr);
}
if(qr>mid){
ret+=sgt_qry(rs[x],mid+1,r,ql,qr);
}
return ret;
}
void bit_mdf(int x,int k,int v){
if(x<1||x>n){
return;
}
for(int i=x;i<=n;i+=i&-i){
sgt_mdf(bit[i],1,lmt,k,v);
}
}
int bit_qry(int l,int r,int ql,int qr){
if(l>r){
return 0;
}
int ret=0;
for(int i=r;i;i-=i&-i){
ret+=sgt_qry(bit[i],1,lmt,ql,qr);
}
for(int i=l-1;i;i-=i&-i){
ret-=sgt_qry(bit[i],1,lmt,ql,qr);
}
return ret;
}
}t;
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i){
scanf("%d",&a[i]);
la[i]=pos[a[i]];
pos[a[i]]=i;
}
t.clear();
lmt=*max_element(a+1,a+1+n);
for(int i=1,l,r,x,y;i<=m;++i){
scanf("%d%d%d%d",&l,&r,&x,&y);
g[r].push_back({l,x,y,i});
}
for(int i=1;i<=n;++i){
t.bit_mdf(i,a[i],1);
for(auto j:g[i]){
ans1[j.id]=t.bit_qry(j.l,i,j.a,j.b);
}
}
t.clear();
for(int i=1;i<=n;++i){
t.bit_mdf(la[i],a[i],1);
for(auto j:g[i]){
ans2[j.id]=ans1[j.id]-t.bit_qry(j.l,i,j.a,j.b);
}
}
for(int i=1;i<=m;++i){
printf("%d %d\n",ans1[i],ans2[i]);
}
}