MnZn求条,平衡树做法
查看原帖
MnZn求条,平衡树做法
907667
thousands_of_years楼主2025/1/19 11:40
#include<bits/stdc++.h>
#define int long long
using namespace std;
char *p1,*p2,buf[100000];
#define nc() (p1==p2 && (p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++)
inline int read()
{
    int x=0,f=1;
    char ch=nc();
    while(ch<48||ch>57)
    {
        if(ch=='-')
            f=-1;
        ch=nc();
    }
    while(ch>=48&&ch<=57)
        x=x*10+ch-48,ch=nc();
   	return x*f;
}
struct node{
	int id,dis;
	node(int a,int b){
		id=a,dis=b;
	}
	bool operator < (const node &u) const {return dis>u.dis;}
};
const int N=3e6+9,maxx=1e6+9;
int n,m;
int a[N];
int b[N];
long long sum=0;
int c[N],d[N],last[N],l[N],r[N];
long long ans[N];
int cnt;int pri[N],val[N];int root=0;int siz[N],ls[N],rs[N],ne[N];
int New(int vall)
{
	pri[++cnt]=rand();
	ne[cnt]=vall+maxx;
	val[cnt]=vall;
	last[cnt]=ne[cnt];
	siz[cnt]=1;
	return cnt;
}
void push_up(int u)
{
	siz[u]=siz[ls[u]]+siz[rs[u]]+1;
}
void spolit(int u,int x,int &L,int &R)
{
	if(u==0)
	{
		L=R=0;
		return ;
	}
	if(siz[ls[u]]+1<=x)
	{
		L=u;
		spolit(rs[u],x-siz[ls[u]]-1,rs[u],R);
	}
	else
	{
		R=u;
		spolit(ls[u],x,L,ls[u]);
	}
	push_up(u);
}
int merge(int L,int R)
{
	if(L==0 || R==0) return L+R;
	if(pri[L]>pri[R])
	{
		rs[L]=merge(rs[L],R);
		push_up(L);
		return L;
	}
	else
	{
		ls[R]=merge(L,ls[R]);
		push_up(R);
		return R;
	}
}
int num=0;
void print(int u)
{
	if(u==0) return ;
	print(ls[u]);
	num++;
	if(val[u]!=0)
	{
		for(int i=ne[u];i;i=ne[i])
		{
			ans[i-maxx]=num;
		}
	}
	print(rs[u]);
}
signed main()
{
	n=read();
	for(int i=1;i<=500003;i++)
	root=merge(root,New(i));
	for(int i=1;i<=n;i++)
	{
		int l=read(),r=read();
		int L,Mid1,Mid2,Mid3,R;
		spolit(root,l-1,L,R);
		spolit(R,r-l+2,Mid1,R);
		spolit(Mid1,r-l+1,Mid1,Mid3);
		spolit(Mid1,r-l,Mid1,Mid2);
		if(val[Mid3]!=0)
		{
			ne[last[Mid2]]=ne[Mid3];
			last[Mid2]=last[Mid3];
		}
		root=merge(L,merge(New(0),merge(merge(Mid1,Mid2),R)));
	}
	print(root);
	m=read();
	while(m--)
	{
		int pos=read();
		cout<<ans[pos]<<endl;
	}
	return 0;
 } 
2025/1/19 11:40
加载中...