You are given a rooted tree with vertices numerated from 1 to n

. A tree is a connected graph without cycles. A rooted tree has a special vertex named root.

Ancestors of the vertex i

are all vertices on the path from the root to the vertex i, except the vertex i itself. The parent of the vertex i is the nearest to the vertex i ancestor of i. Each vertex is a child of its parent. In the given tree the parent of the vertex i is the vertex pi. For the root, the value pi is −1

.

An example of a tree with n=8

, the root is vertex 5. The parent of the vertex 2 is vertex 3, the parent of the vertex 1 is vertex 5. The ancestors of the vertex 6 are vertices 4 and 5, the ancestors of the vertex 7 are vertices 8, 3 and 5

You noticed that some vertices do not respect others. In particular, if ci=1

, then the vertex i does not respect any of its ancestors, and if ci=0

, it respects all of them.

You decided to delete vertices from the tree one by one. On each step you select such a non-root vertex that it does not respect its parent and none of its children respects it. If there are several such vertices, you select the one with the smallest number. When you delete this vertex v

, all children of v become connected with the parent of v

.

An example of deletion of the vertex 7

.

Once there are no vertices matching the criteria for deletion, you stop the process. Print the order in which you will delete the vertices. Note that this order is unique.

Input

The first line contains a single integer n

(1≤n≤105

) — the number of vertices in the tree.

The next n

lines describe the tree: the i-th line contains two integers pi and ci (1≤pi≤n, 0≤ci≤1), where pi is the parent of the vertex i, and ci=0, if the vertex i respects its parents, and ci=1, if the vertex i does not respect any of its parents. The root of the tree has −1 instead of the parent index, also, ci=0 for the root. It is guaranteed that the values pi define a rooted tree with n

vertices.

Output

In case there is at least one vertex to delete, print the only line containing the indices of the vertices you will delete in the order you delete them. Otherwise print a single integer −1

.

Examples

Input
5
3 1
1 1
-1 0
2 1
3 0
Output
1 2 4
Input
5
-1 0
1 1
1 1
2 0
3 0
Output
-1
Input
8
2 1
-1 0
1 0
1 1
1 1
4 0
5 1
7 0
Output
5

Note

The deletion process in the first example is as follows (see the picture below, the vertices with ci=1

are in yellow):

  • first you will delete the vertex 1

, because it does not respect ancestors and all its children (the vertex 2) do not respect it, and 1

  • is the smallest index among such vertices;
  • the vertex 2

will be connected with the vertex 3

  • after deletion;
  • then you will delete the vertex 2

, because it does not respect ancestors and all its children (the only vertex 4

  • ) do not respect it;
  • the vertex 4

will be connected with the vertex 3

  • ;
  • then you will delete the vertex 4
  • , because it does not respect ancestors and all its children (there are none) do not respect it (vacuous truth);
  • you will just delete the vertex 4
  • ;
  • there are no more vertices to delete.

In the second example you don't need to delete any vertex:

  • vertices 2

and 3

  • have children that respect them;
  • vertices 4

and 5

  • respect ancestors.

In the third example the tree will change this way:

题意:输入一个n,接下来n行,每行2个数pi表示第i个结点的父结点,ci为1表示这个结点不尊重他的祖先,为0表示它尊重祖先
对于一个非根结点,如果它不尊重祖先且其孩子不尊重它,则它被删掉且它的孩子连到它的父结点上,输出被删去的结点编号
思路:一开始想如果一个结点被删除就等价于它被它的孩子结点代替,所以如果删除一个结点后就打上删除标记,访问一个被删去的结点时就去访问它的儿子碰到儿子时被删除的结点就递归地访问直到没有一个结点是要被删除的
这样dfs模拟,但这样在test10超时了.其实如果一个结点不尊重祖先,但它的孩子尊重它,则他是不能删的,所以对于一个不尊重祖先但被孩子尊重的结点从它的父结点开始连续的不尊重祖先的结点都是需要删掉的,
所以我们先把不尊重祖先的结点标记,再标记出不尊重祖先但被孩子尊重的结点,最后输出不尊重祖先且不被孩子尊重的结点
注意这里是先标记了不尊重祖先的结点,才看那些是不尊重祖先但被孩子尊重的结点,如果在标记不尊重祖先的结点的同时看那些结点被孩子标记,可能会出现现在这个结点的孩子没被标记为不尊重祖先的结点,但后面的输入是被标记了,这样就错误的把当前这个结点标记为不尊重祖先但被孩子尊重的结点

 #include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
using namespace std;
typedef long long ll;
const int amn=1e5+;
int n,ans[amn],p[amn],c[amn],root;
int main(){
int need[amn];
memset(need,,sizeof need);
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%d%d",&p[i],&c[i]);
if(p[i]==-)root=i;
if(c[i])need[i]=;
}
for(int i=;i<=n;i++){
if(!c[i])need[p[i]]=;
}
int tp=;
for(int i=;i<=n;i++){
if(!need[i]||i==root)continue;
if(c[i]&&need[i])
ans[++tp]=i;
}
if(tp){
for(int i=;i<=tp;i++)printf("%d%c",ans[i],i<tp?' ':'\n');
}
else printf("-1\n");
}
/**
题意:输入一个n,接下来n行,每行2个数pi表示第i个结点的父结点,ci为1表示这个结点不尊重他的祖先,为0表示它尊重祖先
对于一个非根结点,如果它不尊重祖先且其孩子不尊重它,则它被删掉且它的孩子连到它的父结点上,输出被删去的结点编号
思路:一开始想如果一个结点被删除就等价于它被它的孩子结点代替,所以如果删除一个结点后就打上删除标记,访问一个被删去的结点时就去访问它的儿子碰到儿子时被删除的结点就递归地访问直到没有一个结点是要被删除的
这样dfs模拟,但这样在test10超时了.其实如果一个结点不尊重祖先,但它的孩子尊重它,则他是不能删的,所以对于一个不尊重祖先但被孩子尊重的结点从它的父结点开始连续的不尊重祖先的结点都是需要删掉的,
所以我们先把不尊重祖先的结点标记,再标记出不尊重祖先但被孩子尊重的结点,最后输出不尊重祖先且不被孩子尊重的结点
注意这里是先标记了不尊重祖先的结点,才看那些是不尊重祖先但被孩子尊重的结点,如果在标记不尊重祖先的结点的同时看那些结点被孩子标记,可能会出现现在这个结点的孩子没被标记为不尊重祖先的结点,但后面的输入是被标记了,这样就错误的把当前这个结点标记为不尊重祖先但被孩子尊重的结点
**/

[尊老爱幼] Queen的更多相关文章

  1. ACM: Long Live the Queen - 树上的DP

    Long Live the Queen Time Limit:250MS     Memory Limit:4096KB     64bit IO Format:%I64d & %I64u D ...

  2. 皇后(queen)

    皇后(queen)[题目描述] 众所不知,rly现在不会玩国际象棋.但是,作为一个OIer,rly当然做过八皇后问题.这里再啰嗦几句,皇后可以攻击到同行同列同对角线,在n*n的方格中摆n个皇后使其互不 ...

  3. 1976 Queen数列

    1976 Queen数列  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Description 将1到N的整数数列(1 ...

  4. Uva 11538 - Chess Queen

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...

  5. 组合数学 UVa 11538 Chess Queen

    Problem A Chess Queen Input: Standard Input Output: Standard Output You probably know how the game o ...

  6. uva 10401 Injured Queen Problem(dp)

    题目链接:10401 - Injured Queen Problem 题目大意:给出一个字符串,要求在n * n(n为字符串的长度)的棋盘上摆放n个受伤的皇后,受伤的皇后只能攻击到同一列和它周围8个格 ...

  7. C. Queen Codeforces Round #549 (Div. 2) dfs

    C. Queen time limit per test 1 second memory limit per test 256 megabytes input standard input outpu ...

  8. 高可用OpenStack(Queen版)集群-1. 集群环境

    参考文档: Install-guide:https://docs.openstack.org/install-guide/ OpenStack High Availability Guide:http ...

  9. 143. Long Live the Queen 树形dp 难度:0

    143. Long Live the Queen time limit per test: 0.25 sec. memory limit per test: 4096 KB The Queen of ...

随机推荐

  1. 递归、尾递归和使用Stream延迟计算优化尾递归

    我们在学数据结构的时候必然会接触栈(Stack),而栈有一个重要的应用是在程序设计语言中实现递归.递归用途十分广泛,比如我们常见的阶乘,如下代码: 1234 public static int (in ...

  2. [Gem] AASM 狀態機

    @(Ruby on Rails)[rails, gem] 1234 # AASM is a continuation of the acts-as-state-machine rails plugin ...

  3. Android 绘制中国地图

    最近的版本有这样一个需求: 有 3 个要素: 中国地图 高亮省区 中心显示数字 面对这样一个需求,该如何实现呢? 高德地图 因为项目是基于高德地图来做的,所以很自然而然的想到了高德.但是当查阅高德地图 ...

  4. PAT-进制转换

    3.5-进制转换 对于一个P进制的数,如果要转换为Q进制的数,需要分为两步: ①将P进制数x转换为十进制数y 对于一个十进制数y=d1d2···dn,可以将其写为: y = d1 * 10n-1 + ...

  5. web 移动端 横向滚动的阻尼感很强,滑动不灵敏

    在添加 overflow-x: scroll的元素里增加如下style overflow-x: scroll; -webkit-overflow-scrolling: touch; //关键点

  6. JZOJ 5286. 【NOIP2017提高A组模拟8.16】花花的森林 (Standard IO)

    5286. [NOIP2017提高A组模拟8.16]花花的森林 (Standard IO) Time Limits: 1000 ms Memory Limits: 131072 KB Descript ...

  7. 搭建flutter开发

    最近入坑flutter,dart还没开始学,搭环境就干了我一天半,不容易,记录一下, 我们先立个目标,这是我已经配好的,我是真的有强迫症,需要打四个对勾,真的不容易,我们一个一先说一下每一个都代表什么 ...

  8. Androidstudio实现一个简易的加法器——分享两种方法实现(日常作业练习)

    Androidstudio实现一个简易的加法器——分享两种方法实现(日常作业练习)                                                           ...

  9. 基于Linux Lite 4.8制作“Windows 12 Lite”正式发布

    值得注意的是,这款Windows 12 Lite的宣传标语将矛头直指Windows 10,声称不会迫使用户更新.不会存在病毒或恶意软件.启动速度比Win 10快3倍.提供8万多款优质软件.允许与Win ...

  10. Python面向对象之反射,双下方法

    一. 反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被程序 ...