二叉堆,算法是固定的。地址: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;
}