#include #include #include using namespace std; ifstream f ("input.in"); const int NMAX = 100000 + 1; const int LOGMAX = 18 + 1; int n, m, nre; int radacina; int eticheta[NMAX], etichetat[NMAX], prima_aparitie[NMAX], lg2[2 * NMAX]; int rmq[LOGMAX][2 * NMAX]; vector graf[NMAX]; void citeste() { cin >> n >> m; radacina = 1; int a, b; for (int i = 1; i < n; i++) { cin >> a >> b; graf[a].push_back(b); graf[b].push_back(a); } } void parcurgere_euleriana(int nod, int &e, int tata) { eticheta[nod] = ++e; int l = graf[nod].size(), fiu; rmq[0][++nre] = e; prima_aparitie[nod] = nre; etichetat[e] = nod; for (int i = 0; i < l; i++) { fiu = graf[nod][i]; if (fiu != tata) parcurgere_euleriana(fiu, e, nod); rmq[0][++nre] = eticheta[nod]; } } void initializeaza_rmq() { for (int i = 2; i <= nre; i++) lg2[i] = lg2[i / 2] + 1; int l; for (int i = 1; (1 << i) <= nre; i++) for (int j = 1; j <= nre - (1 << i) + 1; j++) { l = 1 << (i - 1); rmq[i][j] = min(rmq[i - 1][j], rmq[i - 1][j + l]); } } void LCA(int a, int b) { initializeaza_rmq(); int a1 = a, b1 = b; a = prima_aparitie[a]; b = prima_aparitie[b]; if (a > b) swap(a, b); int dif = b - a + 1; int l = lg2[dif]; int l2 = dif - (1 << l); int rez = min(rmq[l][a], rmq[l][a + l2]); rez = etichetat[rez]; if (rez == a1 || rez == b1) {cout << "-1\n"; return;} cout << rez << '\n'; } void rezolva() { int tip, a, b, e; for (int i = 1; i <= m; i++) { cin >> tip; if (tip == 2) {cin >> a >> b; LCA(a, b);} else { for (int i = 1; i <= n; i++) eticheta[i] = 0; e = 0; cin >> a; radacina = a; parcurgere_euleriana(radacina, e, 0); initializeaza_rmq(); } } } int main() { citeste(); int e = 0; parcurgere_euleriana(1, e, 0); initializeaza_rmq(); rezolva(); return 0; }