详见:oi-wi
模板:
const int N = 3e6 + 10;
struct Node {
int id, val, par, ch[2], sz;
inline bool operator < (Node & rhs) {return id < rhs.id;}
inline void init(int _id, int _val, int _par) {
id = _id, val = _val, par = _par, ch[0] = ch[1] = 0, sz = 1;
}
}tree[N];
inline int cartesian_build(int n) {
for (int i = 1; i <= n; ++i) {
int k = i-1;
while(tree[k].val > tree[i].val) k = tree[k].par;
tree[i].ch[0] = tree[k].ch[1];
tree[tree[i].ch[0]].par = i;
tree[k].ch[1] = i;
tree[i].par = k;
}
return tree[0].ch[1];
}const int N = 3e6 + 10;
struct N