#include <iostream>
#include <algorithm>
#include <vector>
#include <random>
using namespace std;
mt19937 mt(123);
const int N = 1 << 17;
int dat[N * 2];
void update(int k, int v) {
dat[k + N] = v;
for (int i = k + N >> 1; i > 0; i >>= 1) {
dat[i] = min(dat[i * 2], dat[i * 2 + 1]);
}
}
int query(int l, int r) {
int res = 1e9;
l += N;
r += N;
while (l < r) {
if (l & 1) res = min(res, dat[l++]);
if (r & 1) res = min(res, dat[--r]);
l >>= 1;
r >>= 1;
}
return res;
}
int s;
double r;
void bench_random() {
clock_t start = clock();
for (int i = 0; i < 10000000; i++) {
int a = uniform_int_distribution<int>(0, N - 2)(mt);
int b = uniform_int_distribution<int>(0, N - 2)(mt);
s += a;
s += b;
}
clock_t end = clock();
r = (double)(end - start) / CLOCKS_PER_SEC;
printf("random: %.4f\n", r);
}
void bench_update() {
clock_t start = clock();
for (int i = 0; i < 10000000; i++) {
int k = uniform_int_distribution<int>(0, N - 2)(mt);
int v = uniform_int_distribution<int>(0, N - 2)(mt);
update(k, v);
}
clock_t end = clock();
printf("update: %.4f\n", (double)(end - start) / CLOCKS_PER_SEC);
printf("update-random: %.4f\n", (double)(end - start) / CLOCKS_PER_SEC - r);
}
void bench_query() {
clock_t start = clock();
for (int i = 0; i < 10000000; i++) {
int l = uniform_int_distribution<int>(0, N - 2)(mt);
int r = uniform_int_distribution<int>(0, N - 2)(mt);
if (l > r) swap(l, r);
s += query(l, r + 1);
}
clock_t end = clock();
printf("query: %.4f\n", (double)(end - start) / CLOCKS_PER_SEC);
printf("query-random: %.4f\n", (double)(end - start) / CLOCKS_PER_SEC - r);
printf("result: %d\n", s);
}
int main() {
for (int i = 0; i < N - 2; i++) {
update(i, uniform_int_distribution<int>(0, N - 2)(mt));
}
bench_random();
bench_update();
bench_query();
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8cmFuZG9tPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCm10MTk5MzcgbXQoMTIzKTsKCmNvbnN0IGludCBOID0gMSA8PCAxNzsKaW50IGRhdFtOICogMl07Cgp2b2lkIHVwZGF0ZShpbnQgaywgaW50IHYpIHsKICBkYXRbayArIE5dID0gdjsKICBmb3IgKGludCBpID0gayArIE4gPj4gMTsgaSA+IDA7IGkgPj49IDEpIHsKICAgIGRhdFtpXSA9IG1pbihkYXRbaSAqIDJdLCBkYXRbaSAqIDIgKyAxXSk7CiAgfQp9CgppbnQgcXVlcnkoaW50IGwsIGludCByKSB7CiAgaW50IHJlcyA9IDFlOTsKICBsICs9IE47CiAgciArPSBOOwogIHdoaWxlIChsIDwgcikgewogICAgaWYgKGwgJiAxKSByZXMgPSBtaW4ocmVzLCBkYXRbbCsrXSk7CiAgICBpZiAociAmIDEpIHJlcyA9IG1pbihyZXMsIGRhdFstLXJdKTsKICAgIGwgPj49IDE7CiAgICByID4+PSAxOwogIH0KICByZXR1cm4gcmVzOwp9CgppbnQgczsKZG91YmxlIHI7CnZvaWQgYmVuY2hfcmFuZG9tKCkgewogIGNsb2NrX3Qgc3RhcnQgPSBjbG9jaygpOwogIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDAwMDA7IGkrKykgewogICAgaW50IGEgPSB1bmlmb3JtX2ludF9kaXN0cmlidXRpb248aW50PigwLCBOIC0gMikobXQpOwogICAgaW50IGIgPSB1bmlmb3JtX2ludF9kaXN0cmlidXRpb248aW50PigwLCBOIC0gMikobXQpOwogICAgcyArPSBhOwogICAgcyArPSBiOwogIH0KICBjbG9ja190IGVuZCA9IGNsb2NrKCk7CiAgciA9IChkb3VibGUpKGVuZCAtIHN0YXJ0KSAvIENMT0NLU19QRVJfU0VDOwogIHByaW50ZigicmFuZG9tOiAlLjRmXG4iLCByKTsKfQoKdm9pZCBiZW5jaF91cGRhdGUoKSB7CiAgY2xvY2tfdCBzdGFydCA9IGNsb2NrKCk7CiAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDAwMDAwMDsgaSsrKSB7CiAgICBpbnQgayA9IHVuaWZvcm1faW50X2Rpc3RyaWJ1dGlvbjxpbnQ+KDAsIE4gLSAyKShtdCk7CiAgICBpbnQgdiA9IHVuaWZvcm1faW50X2Rpc3RyaWJ1dGlvbjxpbnQ+KDAsIE4gLSAyKShtdCk7CiAgICB1cGRhdGUoaywgdik7CiAgfQogIGNsb2NrX3QgZW5kID0gY2xvY2soKTsKICBwcmludGYoInVwZGF0ZTogJS40ZlxuIiwgKGRvdWJsZSkoZW5kIC0gc3RhcnQpIC8gQ0xPQ0tTX1BFUl9TRUMpOwogIHByaW50ZigidXBkYXRlLXJhbmRvbTogJS40ZlxuIiwgKGRvdWJsZSkoZW5kIC0gc3RhcnQpIC8gQ0xPQ0tTX1BFUl9TRUMgLSByKTsKfQoKdm9pZCBiZW5jaF9xdWVyeSgpIHsKICBjbG9ja190IHN0YXJ0ID0gY2xvY2soKTsKICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDAwMDAwOyBpKyspIHsKICAgIGludCBsID0gdW5pZm9ybV9pbnRfZGlzdHJpYnV0aW9uPGludD4oMCwgTiAtIDIpKG10KTsKICAgIGludCByID0gdW5pZm9ybV9pbnRfZGlzdHJpYnV0aW9uPGludD4oMCwgTiAtIDIpKG10KTsKICAgIGlmIChsID4gcikgc3dhcChsLCByKTsKICAgIHMgKz0gcXVlcnkobCwgciArIDEpOwogIH0KICBjbG9ja190IGVuZCA9IGNsb2NrKCk7CiAgcHJpbnRmKCJxdWVyeTogJS40ZlxuIiwgKGRvdWJsZSkoZW5kIC0gc3RhcnQpIC8gQ0xPQ0tTX1BFUl9TRUMpOwogIHByaW50ZigicXVlcnktcmFuZG9tOiAlLjRmXG4iLCAoZG91YmxlKShlbmQgLSBzdGFydCkgLyBDTE9DS1NfUEVSX1NFQyAtIHIpOwogIHByaW50ZigicmVzdWx0OiAlZFxuIiwgcyk7Cn0KCmludCBtYWluKCkgewogIGZvciAoaW50IGkgPSAwOyBpIDwgTiAtIDI7IGkrKykgewogICAgdXBkYXRlKGksIHVuaWZvcm1faW50X2Rpc3RyaWJ1dGlvbjxpbnQ+KDAsIE4gLSAyKShtdCkpOwogIH0KICBiZW5jaF9yYW5kb20oKTsKICBiZW5jaF91cGRhdGUoKTsKICBiZW5jaF9xdWVyeSgpOwp9Cgo=