canuc80k7606·7/50

Cây Phân Hoạch Theo Giá Trị Nhỏ Nhất

Nộp bài trên LQDOJ

Bài 7.7 · Advanced Trees

Cho dãy gồm các số nguyên đôi một khác nhau. Cây Cartesian nhỏ nhất của dãy là cây nhị phân có các đỉnh , đồng thời thỏa mãn:

  • khi duyệt cây theo thứ tự trung thứ tự (trái, gốc, phải), ta gặp các đỉnh theo đúng thứ tự ;
  • giá trị tại mỗi đỉnh cha nhỏ hơn giá trị tại mọi đỉnh con của nó.

Hai điều kiện trên xác định duy nhất một cây. Hãy tìm cha của từng đỉnh. Đối với gốc , quy ước cha của gốc là chính nó.

Input

  • Dòng đầu chứa số nguyên . Dòng thứ hai chứa số nguyên .

Output

  • In số nguyên , trong đó là cha của đỉnh .

Constraints

  • .
  • .
  • Các giá trị đôi một khác nhau.

Scoring

  • Subtask ( số điểm): .
  • Subtask ( số điểm): Không có giới hạn bổ sung.

Example

Test 1

Input

5
8 3 6 1 5

Output

1 3 1 3 3

Giải thích: Giá trị nhỏ nhất là tại đỉnh , nên là gốc. Đoạn bên trái có gốc , đoạn bên phải chỉ có đỉnh ; tiếp tục áp dụng cùng quy tắc cho từng đoạn sẽ thu được các quan hệ cha như kết quả.

Lời giải tóm tắt
  • Mô hình cây: Trong mọi đoạn liên tiếp, vị trí có giá trị nhỏ nhất phải là gốc của cây con biểu diễn đoạn đó. Vì thế khi thêm phần tử từ trái sang phải, chỉ đường đi từ gốc tới đỉnh ngoài cùng bên phải có thể thay đổi.
  • Thuật toán: Duy trì một stack chứa đúng đường đi phải của cây Cartesian của prefix đã xử lý, với giá trị tăng dần từ đáy lên đỉnh. Khi xét vị trí i, lấy khỏi stack mọi đỉnh có giá trị lớn hơn a_i. Gốc của phần vừa lấy ra trở thành con trái của i; nếu stack vẫn còn phần tử thì đỉnh stack là cha của i. Sau đó đưa i vào stack.
  • Chứng minh đúng đắn: Ta quy nạp theo độ dài prefix. Trước khi thêm i, stack là đường đi phải của cây đúng. Các đỉnh bị lấy ra tạo thành một suffix liên tiếp trong thứ tự trung thứ tự và đều lớn hơn a_i, nên toàn bộ cây con ấy phải nằm bên trái i; đỉnh bị lấy ra cuối cùng là gốc của suffix đó. Phần tử còn lại trên đỉnh stack là vị trí gần nhất bên trái có giá trị nhỏ hơn a_i, nên nó là cha của i. Các cạnh khác không đổi, do đó invariant tiếp tục đúng. Cuối cùng đáy stack là gốc toàn cây và được gán làm cha của chính nó.
  • Độ phức tạp: Mỗi đỉnh được đưa vào và lấy khỏi stack nhiều nhất một lần, nên thời gian là O(n) và bộ nhớ là O(n).