1 // SEGMENT TREES VERY SIMPLE'S!!! :D...
19 #define forn(i, n) for(int i=0;i<int(n);i++)
20 #define FOR(i, a, b) for(int i=(a);i<int(b);i++)
21 #define RFOR(i, b, a) for(int i=(b);i>int(a);i--)
22 #define foreach(it, c) for(__typeof((c).begin()) it = (c).begin();it!=(c).end();++it)
23 #define ALL(x) (x).begin(),(x).end()
24 #define SIZE(x) (int)(x).size()
25 #define SORT(x) sort(ALL(x))
27 #define VI vector<int>
28 #define VS vector<string>
30 #define ISS istringstream
31 #define OSS ostringstream
36 // SEGMENT TREES! :D...
54 #define forn(i, n) for(int i=0;i<int(n);i++)
55 #define FOR(i, a, b) for(int i=(a);i<int(b);i++)
56 #define RFOR(i, b, a) for(int i=(b);i>int(a);i--)
57 #define foreach(it, c) for(__typeof((c).begin()) it = (c).begin();it!=(c).end();++it)
58 #define ALL(x) (x).begin(),(x).end()
59 #define SIZE(x) (int)(x).size()
60 #define SORT(x) sort(ALL(x))
62 #define VI vector<int>
63 #define VS vector<string>
65 #define ISS istringstream
66 #define OSS ostringstream
69 vector
<int> edges
[MAXN
];
72 int first
, val
, begin
, end
;
81 while( pot
< x
) pot
*=2;
87 void change(int node
, int pos
){
88 if( vec
[pos
+off
] >= 0 ) vec
[pos
+off
] = -1;
89 else vec
[pos
+off
] = pos
;
90 // printf("%i %i\n", pos, vec[pos+off]);
91 for(int x
= (off
+pos
)/2;x
>=1;x
/=2){
92 if( vec
[2*x
] >= 0 ) vec
[x
] = vec
[2*x
];
93 else if( vec
[2*x
+1] >= 0 ) vec
[x
] = vec
[2*x
+1];
95 // printf("%i %i\n", x, vec[x]);
98 int query(int node
,int end
,int begin
, int a
, int b
){
99 // printf("%i %i %i %i %i %i\n", node, begin, end, a, b, vec[node]);
100 if( a
> end
|| b
< begin
) return -1;
101 if( a
>= begin
&& b
<= end
) return vec
[node
];
102 int r
= query(node
*2,end
,begin
,a
,(a
+b
)/2);
103 int s
= query(node
*2+1,end
,begin
,(a
+b
)/2+1,b
);
104 if( r
>= 0 ) return r
;
105 if( s
>= 0 ) return s
;
110 vector
<STREE
> streeVec
;
111 vector
<vector
<int> > nodosVec
;
112 int depth
[MAXN
],chain
[MAXN
], prev
[MAXN
];
113 int prevStree
[MAXN
], homeStree
[MAXN
], homeIndex
[MAXN
];
114 int dep(int node
){if( node
< 0 ) return -1; return depth
[node
];}
117 void constructStree(){
118 if(nodos
.size() == 0 ) return;
120 for(i
=0;i
<nodos
.size();i
++){
121 prevStree
[nodos
[i
]] = prev
[nodos
[0]];
122 homeStree
[nodos
[i
]] = ind
;
123 homeIndex
[nodos
[i
]] = i
;
126 streeVec
.PB(STREE(nodos
.size()));
129 void go(int node
, int father
){
130 nodos
.push_back(node
);
131 if( edges
[node
].size() == 1 && edges
[node
][0] == father
) constructStree();
134 for(i
=0;i
<edges
[node
].size();i
++){
135 if( edges
[node
][i
] == father
) continue;
136 if( dep(edges
[node
][i
]) > dep(larger
) ) larger
= edges
[node
][i
];
138 if( larger
>= 0 )go(larger
,node
);
139 for(i
=0;i
<edges
[node
].size();i
++){
140 if( edges
[node
][i
] == father
) continue;
141 if( edges
[node
][i
] != larger
){
142 nodos
.clear(); go(edges
[node
][i
],node
);
146 void dfs(int node
, int father
){
149 for(i
=0;i
<edges
[node
].size();i
++){
150 if( edges
[node
][i
] == father
) continue;
151 dfs(edges
[node
][i
], node
);
154 for(i
=0;i
<edges
[node
].size();i
++){
155 if( edges
[node
][i
] == father
) continue;
156 depth
[node
] = max( depth
[node
], depth
[edges
[node
][i
]]+1);
159 void query(int node
){
160 int stree
= homeStree
[node
];
161 int f
= streeVec
[stree
].query( 1, homeIndex
[node
],0,0,streeVec
[stree
].off
-1);
163 if( f
>= 0 ) nod
= nodosVec
[stree
][f
];
164 int last
= prevStree
[node
];
165 // printf("%i %i %i\n", stree, f, last);
168 // printf("ENTERS\n");
169 stree
= homeStree
[last
];
170 int aux
= streeVec
[stree
].query( 1, homeIndex
[last
] ,0,0,streeVec
[stree
].off
-1);
171 // printf("stree %i.. last %i ... ax %i\n", stree, last, aux);
174 nod
= nodosVec
[stree
][f
];
176 last
= prevStree
[last
];
178 if(nod
== -1 ) nod
--;
179 printf("%i\n", nod
+1);
181 void change(int node
){
182 int stree
= homeStree
[node
];
183 streeVec
[stree
].change( 1, homeIndex
[node
]);
187 memset(depth
, -1, sizeof(depth
));
188 scanf("%i %i", &N
, &Q
);
191 scanf("%i %i", &a
, &b
);a
--, b
--;
192 edges
[a
].PB(b
), edges
[b
].PB(a
);
199 scanf("%i %i", &op
, &node
);
201 if( op
) query(node
);