#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
const int M = 50010;
struct node {
int key, value;
int id;
}Heap[M];
int Stack[M];
int p[M];
int l[M];
int r[M];
int n;
bool cmp(node p1, node p2) {
return p1.key < p2.key;
}
void build_tree() {
memset(Stack, -1, sizeof(Stack));
for(int i= 0; i <= n; i++)
p[i] = l[i] = r[i] = 0;
int k , top;
top = -1;
for(int i = 1; i <= n; i++) {
k = top;
while(k >= 0 && Heap[Stack[k]].value > Heap[i].value)
k--;
if(k != -1){
p[Heap[i].id] = Heap[Stack[k]].id;
r[Heap[Stack[k]].id] = Heap[i].id;
}
if(k < top) {
p[Heap[Stack[k+1]].id] = Heap[i].id;
l[Heap[i].id] = Heap[Stack[k+1]].id;
}
Stack[++k] = i;
top = k;
}
p[Heap[Stack[0]].id] = 0;
}
int main()
{
while(scanf("%d", &n) != EOF){
for(int i = 1; i <= n; i++){
scanf("%d%d", &Heap[i].key, &Heap[i].value);
Heap[i].id = i;
}
sort(Heap + 1, Heap + n + 1, cmp);
build_tree();
printf("YES\n");
for(int i = 1; i <= n; i++)
printf("%d %d %d\n", p[i], l[i], r[i]);
printf("\n");
}
return 0;
}
poj2051Fence Repair笛卡尔树
最新推荐文章于 2020-05-09 17:07:44 发布