初始时有个首都1,有n个操作
+V表示有一个新的城市连接到了V号城市
-V表示V号城市断开了连接,同时V的子城市也会断开连接
每次输出在每次操作后到首都1距离最远的城市编号,多个距离相同输出编号最小的城市
输入数据保证正确,每次添加与删除的城市一定是与首都相连的
每次都只需要知道最远且编号最小的城市,所以直接使用优先队列存储
如果是+V就使用并查集(不能路径压缩)添加上然后加入优先队列,接着直接弹出首元素就是结果
如果是-V则把V指向0,接着弹出优先队列的第一个元素
如果他与1相连就是答案,否则将他到0这条路上的点都连上0删除他,继续弹出
注意这儿有个trick就是如果没有城市与1相连,答案就是1
然后为了避免这个trick,初始时刻就把1加到优先队列里就可以了。
//
//Created by just_sort 2016/12/30
//Copyright (c) 2016 just_sort.All Rights Reserved
//
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#include <ext/pb_ds/hash_policy.hpp>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <sstream> //isstringstream
#include <iostream>
#include <algorithm>
using namespace std;
using namespace __gnu_pbds;
typedef long long LL;
typedef pair<int, LL> pp;
#define REP1(i, a, b) for(int i = a; i < b; i++)
#define REP2(i, a, b) for(int i = a; i <= b; i++)
#define MP(x, y) make_pair(x,y)
const int maxn = 100010;
const int maxm = 2e5;
const int maxs = 10;
const int INF = 1e9;
typedef tree<int,null_type,less<int>,rb_tree_tag,tree_order_statistics_node_update>order_set;
//head
struct node{
int id, dis;
node(){}
node(int id, int dis) : id(id), dis(dis) {}
bool operator<(const node &rhs) const{
if(dis == rhs.dis)
return id > rhs.id;
return dis < rhs.dis;
}
};
priority_queue <node> ans;
int fa[maxn], dis[maxn];
void init(int n){
while(!ans.empty()) ans.pop();
ans.push(node{1, 0});
for(int i = 0; i <= n; i++) fa[i] = i, dis[i] = 0;
}
int Find(int x){
if(x == fa[x]) return x;
return Find(fa[x]);
}
void add(int f, int s){
fa[s] = f;
dis[s] = dis[f] + 1;
ans.push(node(s, dis[s]));
}
void sub(int f){
fa[f] = 0;
while(!ans.empty()){
node now = ans.top();
if(Find(now.id) == 1) return ;
int s = now.id;
while(fa[s] != 0){
fa[s] = 0;
s = fa[s];
}
ans.pop();
}
}
char cmd;
int main()
{
int tt, x, n, newnode;
scanf("%d", &tt);
while(tt--){
scanf("%d", &n);
init(n + 1);
newnode = 1;
for(int i = 0; i < n; i++){
getchar();
scanf("%c%d", &cmd, &x);
if(cmd == '+'){
add(x, ++newnode);
}
else{
sub(x);
}
node nn = ans.top();
printf("%d\n", nn.id);
}
}
return 0;
}