权值线段树求调/kk
查看原帖
权值线段树求调/kk
121995
CrTsIr400楼主2020/9/16 20:12

似乎没什么问题/dk

#include<bits/stdc++.h>
#define fre(x) freopen(x".in","r",stdin),freopen(x".out","w",stdout)
#define F(i,a,b,c) for(register int i=(a);(b);(c))
#define Fu(i,a,b) F(i,(a),i<=(b),++i)
#define Fd(i,a,b) F(i,(a),i>=(b),--i)
const int inf=0x3fffffff;typedef long long LL;short FL;char CH;template<typename T>bool in(T&a){FL=1,CH=getchar(),a=0;while((CH<'0'||CH>'9')&&CH!=EOF)FL=CH=='-'?-1:1,CH=getchar();if(CH==EOF)return 0;while(CH>='0'&&CH<='9')a=(a<<1)+(a<<3)+CH-'0',CH=getchar();return a*=FL,1;}template<typename T,typename...Args>unsigned char in(T&a,Args&...args){return in(a)+in(args...);}
using namespace std;
const int maxseg=400001;
int S[maxseg],L[maxseg],R[maxseg];
int lsh[100001],lsn,m,cnt=1;
int opx[100001],opp[100001];
void LSH()
{
	sort(lsh+1,lsh+lsn+1);
	lsn=unique(lsh+1,lsh+lsn+1)-lsh;
	Fu(i,1,m)if(opp[i]!=4)opx[i]=lower_bound(lsh+1,lsh+lsn+1,opx[i])-lsh;
}
void biu(int p,int l,int r)
{
	if(l==r)return;
	L[p]=p<<1;R[p]=p<<1|1;register int mid=l+r>>1;
	biu(L[p],l,mid);biu(R[p],mid+1,r);
}
int Cx,Ct;
void chan(int p,int l,int r)
{
	S[p]+=Ct; if(l==r)return;
	register int mid=l+r>>1;
	if(Cx<=mid)chan(L[p],l,mid);
	if(mid<Cx)chan(R[p],mid+1,r);
}
int  kth(int p,int l,int r,int Ck)
{
	if(l==r)return l;
	register int mid=l+r>>1,SLX=S[L[p]];
	if(SLX>=Ck)return kth(L[p],l,mid,Ck);
	return kth(R[p],mid+1,r,Ck-SLX);
}
int Rx;
int  rnk(int p,int l,int r)
{
	if(l==r)return 1;
	register int mid=l+r>>1;
	if(Rx<=mid)return rnk(L[p],l,mid);
	return S[p]+rnk(R[p],mid+1,r);
}
void INS(int x){Cx=x;Ct=1;chan(1,1,lsn);}
void DEL(int x){Cx=x;Ct=-1;chan(1,1,lsn);}
int  RNK(int x){Rx=x;return rnk(1,1,lsn);}
int  KTH(int k){return kth(1,1,lsn,k);}
int  PRE(int x){return KTH(RNK(x-1));}
int  NXT(int x){return KTH(RNK(x)+1);}
int main()
{
	in(m);
	Fu(i,1,m)
	{
		in(opp[i],opx[i]);
		if(opp[i]!=4)lsh[++lsn]=opx[i];
	}
	LSH();
	biu(1,1,lsn);
	Fu(i,1,m)
	{
		if(opp[i]==1)INS(opx[i]);
		if(opp[i]==2)DEL(opx[i]);
		if(opp[i]==3)printf("%d\n",RNK(opx[i]));
		if(opp[i]==4)printf("%d\n",lsh[KTH(opx[i])]);
		if(opp[i]==5)printf("%d\n",lsh[PRE(opx[i])]);
		if(opp[i]==6)printf("%d\n",lsh[NXT(opx[i])]);
	}
	return 0;
}

样例挂了/dk

2020/9/16 20:12
加载中...