Construct a Cartesian tree. I am using the sort + left-hand method. This method is not the best construction method. I will write it out first and then I will not be able to do it today. I am learning other algorithms in the next day. Sorting + left-hand: [cpp] # include <cstdio> # include <cstring> # include <algorithm> using namespace std; struct node {int key, value, idx, lson, rson, fa;} a [50005]; struct renode {int fa, lson, rson, idx;} B [50005]; int n; bool cmp_key (const node & x, const node & y) {return x. key <y. key;} bool cmp_value (const node & x, const node & y) {return x. value <y. value;} void Insert (int now) {int j = now-1; w Hile (a [j]. value> a [now]. value) j = a [j]. fa; a [now]. lson = a [j]. rson; a [a [j]. rson]. fa = now; a [j]. rson = now; a [now]. fa = j ;}int main () {while (scanf ("% d", & n) = 1) {for (int I = 1; I <= n; I ++) {scanf ("% d", & a [I]. key, & a [I]. value); a [I]. lson = a [I]. rson = a [I]. fa = 0; a [I]. idx = I;} bool flag = true; sort (a + 1, a + 1 + n, cmp_value); for (int I = 1; I <n; I ++) if (a [I]. value = a [I + 1]. value) {fla G = false; break;} if (! Flag) {printf ("NO \ n"); continue;} sort (a + 1, a + 1 + n, cmp_key); for (int I = 1; I <n; I ++) if (a [I]. key = a [I + 1]. key) {flag = false; break;} if (! Flag) {printf ("NO \ n"); continue;} a [0]. lson = a [0]. rson = a [0]. fa = 0; a [0]. value =-0x3f7f7f7f; a [0]. idx = 0; for (int I = 1; I <= n; I ++) Insert (I); printf ("YES \ n "); for (int I = 1; I <= n; I ++) {B [a [I]. idx]. fa = a [a [I]. fa]. idx; B [a [I]. idx]. lson = a [a [I]. lson]. idx; B [a [I]. idx]. rson = a [a [I]. rson]. idx ;}for (int I = 1; I <= n; I ++) printf ("% d \ n", B [I]. fa, B [I]. lson, B [I]. rson);} return 0 ;}