#include #include #include typedef struct cvor { int br; struct cvor *l, *d; } cvor; cvor *novi( int x ) { cvor *koren = ( cvor * ) malloc( sizeof( cvor ) ); koren -> l = koren -> d = NULL; koren -> br = x; return koren; } cvor *nadji( cvor *koren, int x ) { if( !koren ) return NULL; if( koren -> br == x ) return koren; cvor *pom = nadji( koren -> l, x ); if( pom ) return pom; return nadji( koren -> d, x ); } cvor *kreirajStablo() { int x; scanf("%d", &x ); cvor *koren = novi( x ); int roditelj; scanf("%d", &roditelj ); while( roditelj ) { cvor *r = nadji( koren, roditelj ); int levi, desni; scanf("%d %d", &levi, &desni ); if( levi ) r -> l = novi( levi ); if( desni ) r -> d = novi( desni ); scanf("%d", &roditelj ); } return koren; } void razmak( int n ) { for( int i = 0; i < n; i ++ ) putchar('\t'); } void vizuelniPrikaz( cvor *koren, int nivo ) { if( !koren ) { razmak( nivo ); puts("~"); } else { vizuelniPrikaz( koren -> d, nivo + 1 ); razmak( nivo ); printf("%d\n", koren -> br ); vizuelniPrikaz( koren -> l, nivo + 1 ); } } int nzp_( cvor *koren, cvor *x, cvor *y, cvor **resenje ) { if( !koren ) return 0; if( koren == x || koren == y ) { *resenje = koren; return 1; } int levo = nzp_( koren -> l, x, y, resenje ); int desno = nzp_( koren -> d, x, y, resenje ); if( levo && desno ) *resenje = koren; return levo || desno; } int nzp( cvor *koren, int x, int y ) { cvor *resenje; nzp_( koren, nadji( koren, x ), nadji( koren, y ), &resenje ); return resenje -> br; } int main() { cvor *koren = kreirajStablo(); vizuelniPrikaz( koren, 0 ); int m; scanf("%d", &m ); while( m -- ) { int x, y; scanf("%d %d", &x, &y ); printf("%d\n", nzp( koren, x, y ) ); } return 0; }