結果

問題 No.1332 Range Nearest Query
ユーザー define
提出日時 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
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

#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";
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0