結果
問題 | No.1332 Range Nearest Query |
ユーザー |
|
提出日時 | 2021-01-09 11:41:22 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 372 ms / 2,500 ms |
コード長 | 4,753 bytes |
コンパイル時間 | 2,400 ms |
コンパイル使用メモリ | 207,068 KB |
最終ジャッジ日時 | 2025-01-17 15:28:11 |
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 48 |
ソースコード
#line 2 "/home/defineprogram/Desktop/Library/template/template.cpp"#include <bits/stdc++.h>using namespace std;#define ll long long#define rep(i, n) for (int i = 0; i < n; i++)#define REP(i, n) for (int i = 1; i < n; i++)#define rev(i, n) for (int i = n - 1; i >= 0; i--)#define all(v) v.begin(), v.end()#define P pair<ll, ll>#define len(s) (ll) s.size()template <class T, class U>inline bool chmin(T &a, U b) {if (a > b) {a = b;return true;}return false;}template <class T, class U>inline bool chmax(T &a, U b) {if (a < b) {a = b;return true;}return false;}constexpr ll inf = 3e18;#line 3 "/home/defineprogram/Desktop/Library/structure/SegmentTree.cpp"template <typename Monoid,typename OperatorMonoid,Monoid (*f)(Monoid, Monoid, int),Monoid (*g)(Monoid, OperatorMonoid, int),OperatorMonoid (*h)(OperatorMonoid, OperatorMonoid, int)>struct Segtree {int size = 1;private:vector<Monoid> dat;vector<OperatorMonoid> lazy;Monoid M;OperatorMonoid OM;public:void eval(int k, int l, int r) {if (lazy[k] != OM) {dat[k] = g(dat[k], lazy[k], r - l);if (r - l > 1) {lazy[(k << 1) + 1] = h(lazy[(k << 1) + 1], lazy[k], r - l);lazy[(k << 1) + 2] = h(lazy[(k << 1) + 2], lazy[k], r - l);}lazy[k] = OM;}}void update(int a, int b, OperatorMonoid M, int k = 0, int l = 0, int r = -1) {if (r == -1) r = size;eval(k, l, r);if (r <= a || b <= l) return;if (a <= l && r <= b) {lazy[k] = h(lazy[k], M, r - l);eval(k, l, r);return;}update(a, b, M, (k << 1) + 1, l, (l + r) >> 1);update(a, b, M, (k << 1) + 2, (l + r) >> 1, r);dat[k] = f(dat[(k << 1) + 1], dat[(k << 1) + 2], r - l);}Monoid query(int a, int b, int k = 0, int l = 0, int r = -1) {if (r == -1) r = size;eval(k, l, r);if (r <= a || b <= l) return M;if (a <= l && r <= b) return dat[k];Monoid lv = query(a, b, (k << 1) + 1, l, (l + r) >> 1);Monoid rv = query(a, b, (k << 1) + 2, (l + r) >> 1, r);return f(lv, rv, r - l);}template <class C>int minLeft(int a, int b, C &check, Monoid x, int k = 0, int l = 0, int r = -1) {if (r == -1) r = size;eval(k, l, r);if (r <= a || b <= l || !check(dat[k], x)) return -1;if (r - l == 1) return l;int lv = minLeft(a, b, check, x, (k << 1) + 1, l, (l + r) >> 1);if (lv != -1) return lv;return minLeft(a, b, check, x, (k << 1) + 2, (l + r) >> 1, r);}template <class C>int maxRight(int a, int b, C &check, Monoid x, int k = 0, int l = 0, int r = -1) {if (r == -1) r = size;eval(k, l, r);if (r <= a || b <= l || !check(dat[k], x)) return -1;if (r - l == 1) return l;int rv = maxRight(a, b, check, x, (k << 1) + 2, (l + r) >> 1, r);if (rv != -1) return rv;return maxRight(a, b, check, x, (k << 1) + 1, l, (l + r) >> 1);}Segtree(int x, Monoid M, OperatorMonoid OM): M(M), OM(OM) {while (size < x) size <<= 1;dat.resize((size << 1) - 1, M);lazy.resize((size << 1) - 1, OM);}};/*@brief Lazy Segment Tree@docs docs/SegmentTree.md*/#line 3 "main.cpp"int N,X[1<<19];auto f=[](int a,int b,int sz){return max(a,b);};auto g=[](int a,int b,int sz){return b;};auto check=[](int a,int b){return a>=b;};struct S{int l,r,x,idx;};int Q;S query[1<<17];int ans[1<<17];int main() {cin.tie(0); ios::sync_with_stdio(false);cin>>N;vector<int>xx;rep(i,N){cin>>X[i];xx.push_back(X[i]);}sort(all(xx));xx.erase(unique(all(xx)),xx.end());rep(i,N){X[i]=lower_bound(all(xx),X[i])-xx.begin();}cin>>Q;rep(i,Q){cin>>query[i].l>>query[i].r>>query[i].x;query[i].idx=i;query[i].l--;}sort(query,query+Q,[](S a,S b){return a.r<b.r;});Segtree<int,int,f,g,g>segtree(N,-1,-1);int cur=0;rep(i,Q){while(cur<query[i].r){segtree.update(X[cur],X[cur]+1,cur);cur++;}int p=lower_bound(all(xx),query[i].x)-xx.begin();int r=segtree.minLeft(p,N,check,query[i].l);int l=segtree.maxRight(0,p,check,query[i].l);ans[query[i].idx]=1e9;if(l!=-1){ans[query[i].idx]=query[i].x-xx[l];}if(r!=-1){chmin(ans[query[i].idx],xx[r]-query[i].x);}}rep(i,Q)cout<<ans[i]<<"\n";}