pui_t _query_max(uint_t ni, uint_t b, uint_t e, uint_t qf, uint_t ql) { // printf("_query_max(%u, %u, %u, %u, %u)\n", ni, b, e, qf, ql); if (b > e || qf > e || ql < b) { // printf("[1] Returning: (-1, -1)\n"); return pui_t(minus_one, minus_one); } if (b >= qf && e <= ql) { // printf("[2] Returning: (%d, %d)\n", this->repr[ni].first, this->repr[ni].second); return this->repr[ni]; } uint_t m = b + (e-b) / 2; pui_t lhs = this->_query_max(ni*2 + 1, b, m, qf, ql); pui_t rhs = this->_query_max(ni*2 + 2, m+1, e, qf, ql); // printf("lhs.second is minus_one: %d, rhs.second is minus_one: %d\n", lhs.second == minus_one, rhs.second == minus_one); if (lhs.second == minus_one) { // printf("[3] Returning: (%d, %d)\n", rhs.first, rhs.second); return rhs; } else if (rhs.second == minus_one) { // printf("[4] Returning: (%d, %d)\n", lhs.first, lhs.second); return lhs; } else { pui_t &tmp = lhs.first > rhs.first ? lhs : rhs; // printf("[5] Returning: (%d, %d)\n", tmp.first, tmp.second); return tmp; } }
pui_t naive_query_max(vui_t const& v, int i, int j) { uint_t mv = v[i]; uint_t mi = i; while (i <= j) { if (v[i] > mv) { mv = v[i]; mi = i; } ++i; } return pui_t(mv, mi); }
pui_t _init(uint_t ni, uint_t b, uint_t e, vui_t const& elems) { // printf("ni: %u, b: %u, e: %u, size: %u\n", ni, b, e, elems.size()); uint_t m = b + (e-b) / 2; if (b == e) { this->repr[ni] = pui_t(elems[b], b); // printf("Returning: [%u, %u]\n", this->repr[ni].first, this->repr[ni].second); return this->repr[ni]; } else { pui_t lhs = this->_init(ni*2 + 1, b, m, elems); pui_t rhs = this->_init(ni*2 + 2, m+1, e, elems); return this->repr[ni] = (lhs.first > rhs.first ? lhs : rhs); } }