自己写的主席树求调
查看原帖
自己写的主席树求调
749630
wxzzzz楼主2023/12/2 17:23

好像和主流写法不一样?

#include <bits/stdc++.h>
#define ll long long
#define rll register ll
#define cll const ll
#define N 1000005
using namespace std;
inline ll read()
{
    rll x=0;bool f=1;register char c=getchar();
    while(c<48||c>57){if(c=='-') f=0;c=getchar();}
    while(c>=48&&c<=57){x=x*10+(c^48);c=getchar();}
    return f?x:-x;
}
inline void write(ll x)
{
    if(x<0) putchar('-'),x=-x;
    if(x>9) write(x/10);
    putchar(x%10+48);
}
cll n=read(),m=read();
ll rt,now,idx=1,a[N],root[N];
struct node{ll l,r,ls,rs,val;}t[N<<2];
inline void build(ll p,ll l,ll r)
{
	t[p].l=l,t[p].r=r;
	if(l==r)
	{
		t[p].val=a[l];
		return;
	}
	rll mid=l+r>>1;
	t[p].ls=++idx,build(t[p].ls,l,mid);
	t[p].rs=++idx,build(t[p].rs,mid+1,r);
}
inline ll change(ll p,ll x,ll k)
{
	if(t[p].l==t[p].r)
	{
		t[++idx].val=k;
		t[idx].l=t[idx].r=t[p].l;
		return idx;
	}
	rll mid=t[p].l+t[p].r>>1;idx++;
	t[idx].l=t[t[p].ls].l;
	t[idx].r=t[t[p].rs].r;
	if(p==rt) root[now]=idx;
	if(x<=mid)
	{
		t[idx].ls=change(t[p].ls,x,k);
		t[idx].rs=t[p].rs;
	}
	else
	{
		t[idx].rs=change(t[p].rs,x,k);
		t[idx].ls=t[p].ls;
	}
	return idx;
}
inline ll query(ll p,ll x)
{
	if(t[p].l==t[p].r) return t[p].val;
	rll mid=t[p].l+t[p].r>>1;
	if(x<=mid) return query(t[p].ls,x);
	else return query(t[p].rs,x);
}
int main()
{
    for(rll i=1;i<=n;i++) a[i]=read();
    build(1,1,n);
    root[0]=1;
    for(rll i=1,v,x,op,val;i<=m;i++)
    {
    	v=read(),op=read(),x=read();
    	if(op==1)
		{
			val=read(),rt=root[v],now=i;
			change(root[v],x,val);
		}
    	else
		{
			root[i]=root[i-1];
			write(query(root[v],x)),putchar('\n');
		}
	}
    return 0;
}
2023/12/2 17:23
加载中...