Как построить treap по неявному ключу из массива?

Покопался в сети, на вики нашел решение за O(n), но я не понял как поддерживать количество элементов в вершинах дерева. После построения обходить дерево не хотелось в итоге родилось вот это вот:


    treap_array(const _list<int>& __d) {
      using T = pair<pnode, int>;
      stack<T, _list<T>> s;
      for (auto x : __d) {
        int p = rnd.rand();
        auto lst = null;
        int sum = 0;
        while (s.size() > 0 and s.top().first->priority < p) {
          auto [last, sz] = s.top();
          s.pop();
          sum += sz;
          last->size += sum;
          lst = last;
        }
        auto n = new node{0, p, x, lst, null};
        n->size = lst->size;
        if (s.size() > 0) {
          s.top().first->right = n;
          s.top().second += sum;
        }
        else
          root = n;
        s.push({n, 1});
      }
      int sum = 0;
      while (s.size() > 0) {
        auto [n, sz] = s.top();
        s.pop();
        sum += sz;
        n->size += sum;
      }
    }

Можно ли так? Что можно улучшить? Или кодинг не для меня?


Ответы (0 шт):