萌新 FHQtreap RE 0pts 求调
查看原帖
萌新 FHQtreap RE 0pts 求调
381354
A_Cabbage楼主2023/11/8 10:30

样例过了,测试点下下来在本地也能过,但是不知道为什么交上去RE……

有没有大佬救救我从昨天晚上调到现在了qwq

#include<bits/stdc++.h>
#define ll long long
#define pt puts("")
#define lu t[u].ls
#define ru t[u].rs
using namespace std;
ll rd()
{
	ll f=1,x=0; char c;
	while (!isdigit(c=getchar())) if (c=='-') f=-1;
	while (isdigit(c)) x=(x<<1)+(x<<3)+(c^48),c=getchar();
	return f*x;
}
void wt(ll x)
{
	if (x<0) putchar('-'),x=-x;
	if (x>9) wt(x/10);
	putchar(x%10+'0');
}
const int M=1e6+5; int n,ct,rt;
struct node{int ls,rs,ky,pr,sz;}t[M];
void nw(int x){t[++ct]={0,0,x,rand(),1};}
void up(int u){t[u].sz=t[lu].sz+t[ru].sz+1;}
void sp(int u,int x,int &l,int &r)
{
	if(u==0) {l=r=0; return;}
	if(t[u].ky<=x) {l=u; sp(ru,x,ru,r);}
	else {r=u; sp(lu,x,l,lu);}
	up(u);
}
int mg(int l,int r)
{
	if(l==0||r==0) return l+r;
	if(t[l].pr>t[r].pr) {t[l].rs=mg(t[l].rs,r); up(l); return l;}
	else {t[r].ls=mg(l,t[r].ls); up(r); return r;}
}
int kt(int u,int k)
{
	if(k==t[lu].sz+1) return u;
	if(k<=t[lu].sz) return kt(lu,k);
	if(k>t[lu].sz) return kt(ru,k-t[lu].sz-1);
}
int ins(int x)
{
	int l,r; sp(rt,x,l,r); nw(x);
	int a=mg(l,ct); rt=mg(a,r);
}
int del(int x)
{
	int l,r,u; sp(rt,x,l,r); sp(l,x-1,l,u);
	u=mg(lu,ru); rt=mg(mg(l,u),r);
}
void rnk(int x)
{
	int l,r; sp(rt,x-1,l,r);
	wt(t[l].sz+1),pt; rt=mg(l,r);
}
void pre(int x)
{
	int l,r; sp(rt,x-1,l,r);
	wt(t[kt(l,t[l].sz)].ky),pt; rt=mg(l,r);
}
void suc(int x)
{
	int l,r; sp(rt,x,l,r);
	wt(t[kt(r,1)].ky),pt; rt=mg(l,r);
}
int main()
{
	srand(time(0)); n=rd();
	while(n--)
	{
		int op=rd(),x=rd();
		if(op==1) ins(x);
		if(op==2) del(x);
		if(op==3) rnk(x);
		if(op==4) wt(t[kt(rt,x)].ky),pt;
		if(op==5) pre(x);
		if(op==6) suc(x);
	}
	return 0;
}
2023/11/8 10:30
加载中...