#include <iostream>
#include <array>
#include <utility>
#include <boost/optional.hpp>
void fill_range(
std::array<boost::optional<std::pair<std::size_t, std::size_t>>, 10u>& ranges,
const std::vector<float>& v,
std::size_t b,
std::size_t e)
{
if (b == e) {
return;
}
int decile_b = v[b] / 0.1f;
int decile_e = v[e - 1] / 0.1f;
if (decile_b == decile_e) {
auto& range = ranges[decile_b];
if (range) {
range->first = std::min(range->first, b);
range->second = std::max(range->second, e);
} else {
range = std::make_pair(b, e);
}
} else {
std::size_t mid = (b + e + 1) / 2;
fill_range(ranges, v, b, mid);
fill_range(ranges, v, mid, e);
}
}
std::array<boost::optional<std::pair<std::size_t, std::size_t>>, 10u>
decile_ranges(const std::vector<float>& v)
{
// assume sorted `v` with value x: 0 <= x < 1
std::array<boost::optional<std::pair<std::size_t, std::size_t>>, 10u> res;
fill_range(res, v, 0, v.size());
return res;
}
void print(
const std::array<boost::optional<std::pair<std::size_t, std::size_t>>, 10u>& a)
{
for (std::size_t i = 0; i != a.size(); ++i) {
const auto& o = a[i];
std::cout << "[" << i * 0.1f << ", " << (i + 1) * 0.1f << "[ = ";
if (o) {
std::cout << o->first << "-" << o->second << std::endl;
} else {
std::cout << "none\n";
}
}
}
int main() {
const std::vector<float> v = {0.f, 0.05f, 0.1f, 0.35f, 0.42f, 0.99f};
print(decile_ranges(v));
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8YXJyYXk+CiNpbmNsdWRlIDx1dGlsaXR5PgojaW5jbHVkZSA8Ym9vc3Qvb3B0aW9uYWwuaHBwPgoKCnZvaWQgZmlsbF9yYW5nZSgKCXN0ZDo6YXJyYXk8Ym9vc3Q6Om9wdGlvbmFsPHN0ZDo6cGFpcjxzdGQ6OnNpemVfdCwgc3RkOjpzaXplX3Q+PiwgMTB1PiYgcmFuZ2VzLAoJY29uc3Qgc3RkOjp2ZWN0b3I8ZmxvYXQ+JiB2LAoJc3RkOjpzaXplX3QgYiwKCXN0ZDo6c2l6ZV90IGUpCnsKCWlmIChiID09IGUpIHsKCQlyZXR1cm47Cgl9CglpbnQgZGVjaWxlX2IgPSB2W2JdIC8gMC4xZjsKCWludCBkZWNpbGVfZSA9IHZbZSAtIDFdIC8gMC4xZjsKCQoJaWYgKGRlY2lsZV9iID09IGRlY2lsZV9lKSB7CgkJYXV0byYgcmFuZ2UgPSByYW5nZXNbZGVjaWxlX2JdOwoJCQoJCWlmIChyYW5nZSkgewoJCQlyYW5nZS0+Zmlyc3QgPSBzdGQ6Om1pbihyYW5nZS0+Zmlyc3QsIGIpOwoJCQlyYW5nZS0+c2Vjb25kID0gc3RkOjptYXgocmFuZ2UtPnNlY29uZCwgZSk7CgkJfSBlbHNlIHsKCQkJcmFuZ2UgPSBzdGQ6Om1ha2VfcGFpcihiLCBlKTsKCQl9Cgl9IGVsc2UgewoJCXN0ZDo6c2l6ZV90IG1pZCA9IChiICsgZSArIDEpIC8gMjsKCQlmaWxsX3JhbmdlKHJhbmdlcywgdiwgYiwgbWlkKTsKCQlmaWxsX3JhbmdlKHJhbmdlcywgdiwgbWlkLCBlKTsKCX0KfQoKc3RkOjphcnJheTxib29zdDo6b3B0aW9uYWw8c3RkOjpwYWlyPHN0ZDo6c2l6ZV90LCBzdGQ6OnNpemVfdD4+LCAxMHU+CmRlY2lsZV9yYW5nZXMoY29uc3Qgc3RkOjp2ZWN0b3I8ZmxvYXQ+JiB2KQp7CgkvLyBhc3N1bWUgc29ydGVkIGB2YCB3aXRoIHZhbHVlIHg6IDAgPD0geCA8IDEKCXN0ZDo6YXJyYXk8Ym9vc3Q6Om9wdGlvbmFsPHN0ZDo6cGFpcjxzdGQ6OnNpemVfdCwgc3RkOjpzaXplX3Q+PiwgMTB1PiByZXM7CglmaWxsX3JhbmdlKHJlcywgdiwgMCwgdi5zaXplKCkpOwoJcmV0dXJuIHJlczsKfQoKdm9pZCBwcmludCgKCWNvbnN0IHN0ZDo6YXJyYXk8Ym9vc3Q6Om9wdGlvbmFsPHN0ZDo6cGFpcjxzdGQ6OnNpemVfdCwgc3RkOjpzaXplX3Q+PiwgMTB1PiYgYSkKewoJZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSAhPSBhLnNpemUoKTsgKytpKSB7CgkJY29uc3QgYXV0byYgbyA9IGFbaV07CgkJCgkJc3RkOjpjb3V0IDw8ICJbIiA8PCBpICogMC4xZiA8PCAiLCAiIDw8IChpICsgMSkgKiAwLjFmIDw8ICJbID0gIjsKCQlpZiAobykgewoJCQlzdGQ6OmNvdXQgPDwgby0+Zmlyc3QgPDwgIi0iIDw8IG8tPnNlY29uZCA8PCBzdGQ6OmVuZGw7CgkJfSBlbHNlIHsKCQkJc3RkOjpjb3V0IDw8ICJub25lXG4iOwoJCX0KCX0KfQoKCmludCBtYWluKCkgewoJY29uc3Qgc3RkOjp2ZWN0b3I8ZmxvYXQ+IHYgPSB7MC5mLCAwLjA1ZiwgMC4xZiwgMC4zNWYsIDAuNDJmLCAwLjk5Zn07CgogICAgcHJpbnQoZGVjaWxlX3Jhbmdlcyh2KSk7Cn0=