全职线段树求条
查看原帖
全职线段树求条
1011279
Naoxiaoyu楼主2024/3/3 08:18
#include<bits/stdc++.h>
using namespace std;
const int N=1e7+10;
int t[4*N];
void change(int p,int l,int r,int x,int y)
{
	if(l==r)
	{
		t[p]+=y;
		return;
	}
	int mid=(l+r)/2;
	if(x<=mid) change(p*2,l,mid,x,y);
	else change(p*2+1,mid+1,r,x,y);
	t[p]=t[p*2]+t[p*2+1];
}
int kth(int p,int l,int r,int x)
{
	if(l==r) return l;
	int mid=(l+r)/2;
	if(x<=t[p*2]) return kth(p*2,l,mid,x);
	else return kth(p*2+1,mid+1,r,x-t[p*2]);
}
int ask(int p,int l,int r,int x)
{
	if(r<=x-1) return t[p];
	int mid=(l+r)/2;
	int ans=0;
	ans+=ask(p*2,l,mid,x);
	if(x-1>=mid+1) ans+=ask(p*2+1,mid+1,r,x);
	return ans;
}
int findq(int p,int l,int r)
{
	if(l==r) return l;
	int mid=(l+r)/2;
	if(t[p*2+1]) return findq(p*2+1,mid+1,r);
	else return findq(p*2,l,mid);
}
int qianqu(int p,int l,int r,int x)
{
	if(r<=x-1)
	{
		if(t[p]) return findq(p,l,r);
		else return 0;
	}
	int mid=(l+r)/2;
	int re;
	if(mid+1<=x-1 && t[p*2+1] && (re=qianqu(p*2+1,mid+1,r,x)))
		return re;
	return qianqu(p*2,l,mid,x);
}
int findh(int p,int l,int r)
{
	if(l==r) return l;
	int mid=(l+r)/2;
	if(t[p*2]) return findq(p*2,l,mid);
	else return findq(p*2+1,mid+1,r);
}
int houji(int p,int l,int r,int x)
{
	if(x+1<=l)
	{
		if(t[p]) return findh(p,l,r);
		else return 0;
	}
	int mid=(l+r)/2;
	int le;
	if(x+1<=mid && t[p*2] && (le=houji(p*2,l,mid,x)))
		return le;
	return houji(p*2+1,mid+1,r,x);
}
int main()
{
	int n;
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		int opt,x;
		scanf("%d%d",&opt,&x);
		if(opt==1) change(1,1,1e7,x,1);
		else if(opt==2) change(1,1,1e7,x,-1);
		else if(opt==3) printf("%d\n",ask(1,1,1e7,x)+1);
		else if(opt==4) printf("%d\n",kth(1,1,1e7,x));
		else if(opt==5) printf("%d\n",qianqu(1,1,1e7,x));
		else printf("%d\n",houji(1,1,1e7,x));
	}
	return 0;
} 
2024/3/3 08:18
加载中...