二叉堆,算法是固定的。地址:http://acm.pku.edu.cn/JudgeOnline/problem?id=2201
#include <stdio.h>

typedef struct


{
int k;
int a;
int left;
int right;
int parent;
}node;
node tree[50005];

int num[50005];

int judge(int a, int b)


{
int ans;
if(tree[num[a]].k>tree[num[b]].k)

{
ans = 1;
}
else if(tree[num[a]].k<tree[num[b]].k)

{
ans = -1;
}
else

{
ans = 0;
}
return ans;
}

void swap(int a, int b)


{
int t;
t = num[a];
num[a] = num[b];
num[b] = t;
}

int partion(int low, int high, int p)


{
while(low<=high)

{
if(low<p)

{
if(judge(low, p)>0)

{
swap(low, p);
p = low;
}
low ++;
}
else

{
if(high>p)

{
if(judge(high, p)<0)

{
swap(high, p);
p = high;
}
}
high --;
}
}
return p;
}

void qsort(int left, int right)


{
int middle;
if(left<right)

{
middle = (left+right) / 2;
middle = partion(left, right, middle);
qsort(left, middle-1);
qsort(middle+1, right);
}
}

void creat_tree(int n)


{

int i;
int p;
int temp;
qsort(0, n-1);
tree[num[0]].left = tree[num[0]].parent = tree[num[0]].right = -1;
for (i=1; i<n; i++)

{
p = num[i-1];
while (tree[p].a>=tree[num[i]].a && tree[p].parent!=-1)

{
p = tree[p].parent;
}

if (tree[p].parent==-1 && tree[p].a>=tree[num[i]].a)

{
tree[num[i]].left = p;
tree[num[i]].right = -1;
tree[num[i]].parent = -1;
tree[p].parent = num[i];
}
else

{
temp = tree[p].right;
tree[p].right = num[i];
tree[num[i]].left = temp;
tree[num[i]].right = -1;
tree[num[i]].parent = p;
tree[temp].parent = num[i];
}
}
}

int main()


{

int n;
int i;
while (scanf("%d", &n) != EOF)

{
for (i=0; i<n; i++)

{
scanf("%d%d", &tree[i].k, &tree[i].a);
num[i] = i;
}
creat_tree(n);
printf("YES\n");
for (i=0; i<n; i++)

{
printf("%d %d %d\n", tree[i].parent+1, tree[i].left+1, tree[i].right+1);
}
}
return 0;
}

