while (k >= 2)
  {
    struct rb_node *q = pa[k - 1]->rb_link[da[k - 1]];

    if (pa[k - 1]->rb_color == RB_BLACK)
      {
        q->rb_color = RB_RED;
        break;
      }

    if (da[k - 2] == 0)
      {
        struct rb_node *y = pa[k - 2]->rb_link[1];

        if (y != NULL && y->rb_color == RB_RED)
          {
            pa[k - 1]->rb_color = y->rb_color = RB_BLACK;
            q->rb_color = RB_RED;
            k -= 2;
          }
        else
          {
            struct rb_node *x;

            if (da[k - 1] == 0)
              y = pa[k - 1];
            else
              {
                x = pa[k - 1];
                y = pa[k - 2]->rb_link[0] = q;
                x->rb_link[1] = y->rb_link[0];
                q = y->rb_link[0] = x;
              }

            x = pa[k - 2];
            x->rb_color = q->rb_color = RB_RED;
            y->rb_color = RB_BLACK;

            x->rb_link[0] = y->rb_link[1];
            y->rb_link[1] = x;
            pa[k - 3]->rb_link[da[k - 3]] = y;
            break;
          }
      }
    else
      {
        struct rb_node *y = pa[k - 2]->rb_link[0];

        if (y != NULL && y->rb_color == RB_RED)
          {
            pa[k - 1]->rb_color = y->rb_color = RB_BLACK;
            q->rb_color = RB_RED;
            k -= 2;
          }
        else
          {
            struct rb_node *x;

            if (da[k - 1] == 1)
              y = pa[k - 1];
            else
              {
                x = pa[k - 1];
                y = pa[k - 2]->rb_link[1] = q;
                x->rb_link[0] = y->rb_link[1];
                q = y->rb_link[1] = x;
              }

            x = pa[k - 2];
            x->rb_color = q->rb_color = RB_RED;
            y->rb_color = RB_BLACK;

            x->rb_link[1] = y->rb_link[0];
            y->rb_link[0] = x;
            pa[k - 3]->rb_link[da[k - 3]] = y;
            break;
          }
      }
  }
