主页
最近更新
捐赠
云剪贴板 e43a22r9
作者
dfgz
复制 Markdown
更新剪贴板内容
# 板子 ```cpp #include<bits/stdc++.h> #define int long long const int N = 2e6+10; using namespace std; int n,m,a[N],x,y,dist[N],vis[N],son[N][2],fa[N]; int Find(int x) {return ((fa[x]==x)?x:(fa[x]=Find(fa[x])));} int Merge(int x,int y) { if(!x||!y) return x+y; if(a[x]>a[y]||(a[x]==a[y]&&x>y)) swap(x,y); fa[y]=x;son[x][1]=Merge(son[x][1],y); if(dist[son[x][0]]<dist[son[x][1]]) swap(son[x][1],son[x][0]); dist[x]=dist[son[x][1]]+1; return x; } void Erase(int x) { x=Find(x);vis[x]=1; printf("%lld\n",a[x]); int p=Merge(son[x][0],son[x][1]); if(son[x][0]==x) son[fa[x]][0]=p; else if(son[x][1]==x) son[fa[x]][1]=p; fa[p]=p;fa[x]=p; } signed main() { scanf("%lld",&n); for(int i=1;i<=n;i++) { scanf("%lld",&a[i]); dist[i]=1;fa[i]=i; } cin>>m; char opt; for(int i=1;i<=m;i++) { // scanf("%lld",&opt); cin>>opt; if(opt=='M') { scanf("%lld%lld",&x,&y); int fx=Find(x),fy=Find(y); if(fx!=fy&&!vis[x]&&!vis[y]) Merge(fx,fy); } else { scanf("%lld",&x); if(vis[x]) puts("0"); else Erase(x); } } return 0; } ```
Loading...