const int N = 2e4+100;
int T[N<<2];
void update(int p,int v,int rt,int l,int r)//值为p的个数加v(-1表示删除,1表示添加)
{
T[rt]+=v;
if(l==r) return ;
int m=(l+r>>1);
if(p<=m) update(p,v,rt<<1,l,m);
else update(p,v,rt<<1|1,m+1,r);
}
int Kth(int K,int rt,int l,int r)//查询全局第K大
{
if(l==r) return l;
int m=(l+r>>1);
if(T[rt<<1]>=K) return Kth(K,rt<<1,l,m);
return Kth(K-T[rt<<1],rt<<1|1,m+1,r);
}
int Rank(int p,int rt,int l,int r)//查询p在全局的排名
{
if(r<p) return T[rt];
int m=(l+r>>1),res=0;
res+=Rank(p,rt<<1,l,m);
if(m<p-1) res+=Rank(p,rt<<1|1,m+1,r);
return res;
}
int Find_p(int rt,int l,int r)
{
if(l==r) return l;
int m=(l+r>>1);
if(T[rt<<1|1]) return Find_p(rt<<1|1,m+1,r);
return Find_p(rt<<1,l,m);
}
int Pre(int p,int rt,int l,int r)//前驱
{
if(r<p)
{
if(T[rt]) return Find_p(rt,l,r);
return 0;
}
int m=(l+r>>1),Re;
if(m<p-1 && T[rt<<1|1] && (Re=Pre(p,rt<<1|1,m+1,r)))
return Re;
return Pre(p,rt<<1,l,m);
}
int Find_n(int rt,int l,int r)
{
if(l==r) return l;
int m=(l+r>>1);
if(T[rt<<1]) return Find_n(rt<<1,l,m);
return Find_n(rt<<1|1,m+1,r);
}
int Nex(int p,int rt,int l,int r)
{
if(p<l)
{
if(T[rt]) return Find_n(rt,l,r);
return 0;
}
int m=(l+r>>1),Re;
if(p<m && T[rt<<1] && (Re=Nex(p,rt<<1,l,m)))
return Re;
return Nex(p,rt<<1|1,m+1,r);
}
权值线段树【模板】
最新推荐文章于 2023-01-29 13:53:51 发布