Các lượt nộp
    Danh sách bài
    Trang chủ
    Báo lỗi

    solution

    Đề bài: [Trình biên dịch] Truy vấn phạm vi tĩnh trên cây khối

    Thay vì mô tả các khối lệnh bằng một dãy BEGIN/END tuần tự, phần này biểu diễn cấu trúc lồng khối của chương trình dưới dạng cây khối cho trước một cách tường minh: có nnn khối đánh số từ 111 đến nnn, khối số 111 là khối gốc (không có khối cha). Với mỗi khối iii (2≤i≤n2 \le i \le n2≤i≤n), pip_ipi​ là chỉ số khối cha của nó, và pi<ip_i < ipi​<i. Mỗi khối iii có một danh sách các tên biến được khai báo trực tiếp trong khối đó (dữ liệu vào đảm bảo trong cùng một khối không có hai biến trùng tên).

    Theo luật phạm vi tĩnh (static scoping), khi tìm một biến tên vvv xuất phát từ khối bbb, trình biên dịch sẽ tìm trong chính khối bbb trước, nếu không thấy thì tìm tiếp ở khối cha của bbb, rồi khối cha của khối cha, cứ thế đi lên cho tới khối gốc.

    Cho qqq truy vấn, mỗi truy vấn gồm một khối bbb và một tên biến vvv: hãy tìm chỉ số của khối gần bbb nhất (tính cả bbb) trên đường đi từ bbb lên khối gốc mà có khai báo trực tiếp biến tên vvv; nếu không có khối nào trên đường đi đó khai báo vvv, trả lời −1-1−1.

    Ví dụ: cây gồm 4 khối: khối 1 (gốc) khai báo x; khối 2 (cha là 1) khai báo y; khối 3 (cha là 2) không khai báo gì; khối 4 (cha là 1) khai báo x. Với truy vấn (3, x): đường đi 3→2→13 \to 2 \to 13→2→1, khối 3 và 2 không có x, khối 1 có x ⇒\Rightarrow⇒ trả lời 111.

    • Định dạng đầu vào:

      Dòng đầu tiên chứa số nguyên nnn (1≤n≤10001 \le n \le 10001≤n≤1000). nnn dòng tiếp theo, dòng thứ iii mô tả khối iii: gồm pip_ipi​ (chỉ số khối cha, quy ước p1=0p_1 = 0p1​=0 nghĩa là khối gốc không có cha), kik_iki​ (số biến khai báo trực tiếp trong khối iii), và kik_iki​ tên biến cách nhau bởi khoảng trắng (kik_iki​ có thể bằng 000). Dòng tiếp theo chứa số nguyên qqq (1≤q≤10001 \le q \le 10001≤q≤1000) — số truy vấn. qqq dòng sau đó, mỗi dòng gồm hai giá trị bbb và vvv (chỉ số khối và tên biến cần tra).

    • Định dạng đầu ra:

      In ra qqq dòng, mỗi dòng là kết quả (chỉ số khối tìm được, hoặc −1-1−1) tương ứng với từng truy vấn theo đúng thứ tự.

    Ví dụ:

    Đầu vào:

    4
    0 1 x
    1 1 y
    2 0
    1 1 x
    3
    3 x
    3 y
    4 x
    

    Đầu ra:

    1
    2
    4
    

    Đầu vào:

    1
    0 0
    1
    1 z
    

    Đầu ra:

    -1
    

    Đang tải editor...