結果
問題 | No.1332 Range Nearest Query |
ユーザー |
![]() |
提出日時 | 2021-01-08 21:59:31 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 928 ms / 2,500 ms |
コード長 | 2,584 bytes |
コンパイル時間 | 2,216 ms |
コンパイル使用メモリ | 199,520 KB |
最終ジャッジ日時 | 2025-01-17 11:57:40 |
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 48 |
ソースコード
#include<bits/stdc++.h>using namespace std;#define int long long#define ii pair <int, int>#define app push_back#define all(a) a.begin(), a.end()#define bp __builtin_popcountll#define ll long long#define mp make_pair#define x first#define y second#define Time (double)clock()/CLOCKS_PER_SEC#define debug(x) std::cout << #x << ": " << x << '\n';#define FOR(i, n) for (int i = 0; i < n; ++i)#define pb push_back#define trav(a, x) for (auto& a : x)using vi = vector<int>;template <typename T>std::ostream& operator <<(std::ostream& output, const pair <T, T> & data){output << "(" << data.x << "," << data.y << ")";return output;}template <typename T>std::ostream& operator <<(std::ostream& output, const std::vector<T>& data){for (const T& x : data)output << x << " ";return output;}//ll div_up(ll a, ll b) { return a/b+((a^b)>0&&a%b); } // divide a by b rounded up//ll div_down(ll a, ll b) { return a/b-((a^b)<0&&a%b); } // divide a by b rounded down#define tcT template<class T#define tcTU tcT, class UtcT> using V = vector<T>;tcT> void re(V<T>& x) {trav(a, x)cin >> a;}tcT> bool ckmin(T& a, const T& b) {return b < a ? a = b, 1 : 0;} // set a = min(a,b)tcT> bool ckmax(T& a, const T& b) {return a < b ? a = b, 1 : 0;}const int N = 3e5+7, INF = 1e9+7;int n, q;int a[N];vi t[N << 2];void build(int v, int tl, int tr) {if (tl == tr) {t[v] = {a[tl]};return;}int tm = (tl + tr) >> 1;build(v * 2 + 1, tl, tm);build(v * 2 + 2, tm + 1, tr);trav (x, t[v * 2 + 1])t[v].app(x);trav (x, t[v * 2 + 2])t[v].app(x);sort(all(t[v]));}int get(int v, int tl, int tr, int l, int r, int x) {if (tr < l || r < tl)return INF;if (l <= tl && tr <= r) {auto u = lower_bound(all(t[v]), x);int ans = INF;if (u != t[v].begin())ckmin(ans, abs(*prev(u) - x));if (u != t[v].end())ckmin(ans, abs(*u - x));return ans;}int tm = (tl + tr) >> 1;return min(get(v * 2 + 1, tl, tm, l, r, x) , get(v * 2 + 2, tm + 1, tr, l, r, x));}signed main() {#ifdef HOMEfreopen("input.txt", "r", stdin);#else#define endl '\n'ios_base::sync_with_stdio(0); cin.tie(0);#endifcin >> n;FOR (i, n)cin >> a[i];build(0, 0, n - 1);cin >> q;while (q--) {int l, r, x;cin >> l >> r >> x;cout << get(0, 0, n - 1, l - 1, r - 1, x) << endl;}}