ACPC2014 Day2 I Hard Beans

解法

WaveletMatrixで殴ると通ります.
具体的には,区間の何番目の値が D との大小関係の境界になっているか quantile で二分探索するだけです.

ソースコード

#include <bits/stdc++.h>
using namespace std;

// wavelet matrix が長すぎる

int main() {
    int N;
    cin >> N;
    vector<int> a(N);
    for(int i = 0; i < N; ++i) {
        cin >> a[i];
    }

    wavelet_matrix<int> wm(a);
    int Q;
    cin >> Q;
    while(Q--) {
        int l, r, D;
        cin >> l >> r >> D;
        int lb = 0, ub = r - l;
        while(ub - lb > 1) {
            int m = (ub + lb) / 2;
            if(wm.quantile(l, r + 1, m) >= D) {
                lb = m;
            } else {
                ub = m;
            }
        }
        cout << min(abs(wm.quantile(l, r + 1, lb) - D), abs(wm.quantile(l, r + 1, ub) - D)) << endl;
    }
}

感想

想定解はなんだろう?流石にWaveletMatrixで殴れって問題じゃないはずだけども.