solution-code1608
二叉堆和 RMQ 结合的好题,不停地取 Query 的最大值即可。
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>using namespace std;struct Node{  int x,y,id;}a[50005];int n,f[50005][17],pos[50005][17],fa[50005],Ls[50005],Rs[50005];inline void Init(void){  int i,j;  for(i=1;i<=n;++i)  {    f[i][0]=a[i].y;    pos[i][0]=i;  }  for(j=1;j<=16;++j)  {    for(i=1;i+(1<<j)-1<=n;++i)    {      if(f[i][j-1]<f[i+(1<<(j-1))][j-1])      {        f[i][j]=f[i][j-1];        pos[i][j]=pos[i][j-1];      }      else if(f[i][j-1]>f[i+(1<<(j-1))][j-1])      {        f[i][j]=f[i+(1<<(j-1))][j-1];        pos[i][j]=pos[i+(1<<(j-1))][j-1];      }    }  }  return;}inline int Ask(int L,int R){  int x=log2(R-L+1);  if(f[L][x]<=f[R-(1<<x)+1][x])return pos[L][x];  else return pos[R-(1<<x)+1][x];}inline int dfs(int L,int R,int pre){  if(L>R)return 0;  int mid=Ask(L,R),x=a[mid].id;  fa[x]=pre;  Ls[x]=dfs(L,mid-1,x);  Rs[x]=dfs(mid+1,R,x);  return x;}inline bool cmp(const Node& a,const Node& b){  return a.x<b.x;}int main(void){  int i,x,y,rt;  scanf("%d",&n);  for(i=1;i<=n;++i)  {    scanf("%d%d",&x,&y);    a[i]=(Node){x,y,i};  }  sort(a+1,a+n+1,cmp);  Init();  rt=dfs(1,n,0);  printf("YES\n");  for(i=1;i<=n;++i)printf("%d %d %d\n",fa[i],Ls[i],Rs[i]);  return 0;}