結果
問題 | No.1332 Range Nearest Query |
ユーザー |
![]() |
提出日時 | 2022-12-13 17:57:57 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 399 ms / 2,500 ms |
コード長 | 11,532 bytes |
コンパイル時間 | 3,200 ms |
コンパイル使用メモリ | 234,316 KB |
最終ジャッジ日時 | 2025-02-09 11:01:57 |
ジャッジサーバーID (参考情報) |
judge2 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 48 |
ソースコード
#pragma region template#pragma GCC optimize("Ofast")#include <bits/stdc++.h>using namespace std;using ll=long long;using ld=long double;using vi=vector<int>;using vll=vector<ll>;using pi=pair<int,int>;using pll=pair<ll,ll>;#define overload2(a,b,c,...) c#define overload3(a,b,c,d,...) d#define overload4(a,b,c,d,e,...) e#define overload5(a,b,c,d,e,f,...) f#define TYPE1(T) template<typename T>#define TYPE2(T,U) template<typename T,typename U>#define TYPE(...) overload2(__VA_ARGS__,TYPE2,TYPE1)(__VA_ARGS__)#define TYPES1(T) template<typename... T>#define TYPES2(H,T) template<typename H,typename... T>#define TYPES(...) overload2(__VA_ARGS__,TYPES2,TYPES1)(__VA_ARGS__)#define REP4(i,s,n,d) for(int i=(s);i<(n);i+=(d))#define REP3(i,s,n) REP4(i,s,n,1)#define REP2(i,n) REP3(i,0,n)#define REP1(n) REP2(tomato,n)#define REP(...) overload4(__VA_ARGS__,REP4,REP3,REP2,REP1)(__VA_ARGS__)#define RREP4(i,n,s,d) for(int i=(n)-1;i>=s;i-=d)#define RREP3(i,n,s) RREP4(i,n,s,1)#define RREP2(i,n) RREP3(i,n,0)#define RREP1(n) RREP2(tomato,n)#define RREP(...) overload4(__VA_ARGS__,RREP4,RREP3,RREP2,RREP1)(__VA_ARGS__)#define FOR4(a,b,c,d,v) for(auto [a,b,c,d]:v)#define FOR3(a,b,c,v) for(auto [a,b,c]:v)#define FOR2(a,b,v) for(auto [a,b]:v)#define FOR1(a,v) for(auto a:v)#define FOR(...) overload5(__VA_ARGS__,FOR4,FOR3,FOR2,FOR1)(__VA_ARGS__)#define AFOR4(a,b,c,d,v) for(auto&[a,b,c,d]:v)#define AFOR3(a,b,c,v) for(auto&[a,b,c]:v)#define AFOR2(a,b,v) for(auto&[a,b]:v)#define AFOR1(a,v) for(auto&a:v)#define AFOR(...) overload5(__VA_ARGS__,AFOR4,AFOR3,AFOR2,AFOR1)(__VA_ARGS__)#define CFOR4(a,b,c,d,v) for(const auto&[a,b,c,d]:v)#define CFOR3(a,b,c,v) for(const auto&[a,b,c]:v)#define CFOR2(a,b,v) for(const auto&[a,b]:v)#define CFOR1(a,v) for(const auto&a:v)#define CFOR(...) overload5(__VA_ARGS__,CFOR4,CFOR3,CFOR2,CFOR1)(__VA_ARGS__)#define ALL(v) v.begin(),v.end()#define RALL(v) v.rbegin(),v.rend()#define SORT(v) sort(ALL(v))#define RSORT(v) sort(RALL(v))#define REVERSE(v) reverse(ALL(v))#define UNIQUE(v) SORT(v),v.erase(unique(ALL(v)),v.end())TYPES(T) void input(T&... a){ (cin>>...>>a); }#define DECLARE(T,...) T __VA_ARGS__;input(__VA_ARGS__);#define INT(...) DECLARE(int,__VA_ARGS__)#define STR(...) DECLARE(string,__VA_ARGS__)#define LL(...) DECLARE(long long,__VA_ARGS__)#define CHR(...) DECLARE(char,__VA_ARGS__)#define DBL(...) DECLARE(double,__VA_ARGS__)#define VI(n,v) vi v(n);cin>>v;#define VLL(n,v) vll v(n);cin>>v;TYPE(T) istream&operator>>(istream&is,vector<T>&v){for(auto&a:v)cin>>a;return is;}TYPE(T) ostream&operator<<(ostream&os,const vector<T>&v){if(&os==&cerr)os<<"[";REP(i,v.size()){os<<v[i];if(i+1<v.size())os<<(&os==&cerr?",":" ");}if(&os==&cerr)os<<"]";return os;}TYPE(T,S) istream&operator>>(istream&is,pair<T,S>&p){cin>>p.first>>p.second;return is;}#ifdef __LOCAL#include <debug>#else#define debug(...) void(0)#endifvoid print(){ cout << '\n'; }TYPES(T,Ts) void print(const T& a,const Ts&... b){cout<<a;(cout<<...<<(cout<< ' ',b));cout << '\n';}TYPE(T) using pq=priority_queue<T>;TYPE(T) using pqg=priority_queue<T,vector<T>,greater<T>>;TYPE(T) T pick(queue<T>& que){assert(que.size()); T a=que.front();que.pop();return a;}TYPE(T) T pick(pq<T>& que){assert(que.size()); T a=que.top();que.pop();return a;}TYPE(T) T pick(pqg<T>& que){assert(que.size()); T a=que.top();que.pop();return a;}TYPE(T) T pick(stack<T>& sta){assert(sta.size()); T a=sta.top();sta.pop();return a;}string YES(bool f=true){return (f?"YES":"NO");}string Yes(bool f=true){return (f?"Yes":"No");}string yes(bool f=true){return (f?"yes":"no");}constexpr int INF=1e9+7;constexpr ll LINF=ll(1e18)+7;constexpr ld EPS=1e-10;vi iota(int n){vi a(n);iota(ALL(a),0);return a;}TYPE(T) vector<pair<T,int>> query_sort(const vector<T>&v){vector<pair<T,int>> res(v.size());REP(i,v.size())res[i]={v[i],i};SORT(res);return res;}TYPE(T) T rev(T a){ REVERSE(a);return a; }TYPE(T) void fin(T a){cout<<a<<endl;exit(0);}TYPE(T) bool chmax(T &a,T b){return (a<b&&(a=b,true));}TYPE(T) bool chmin(T &a,T b){return (a>b&&(a=b,true));}TYPES(T,Ns) auto make_vector(T x,int n,Ns ...ns){if constexpr(sizeof...(ns)==0)return vector<T>(n,x);else return vector(n,make_vector<T>(x,ns...));}bool in(const ll S,const int a){return (S>>a)&1;}int popcount(const ll S){return __builtin_popcountll(S);}int digit(char c){ return (c>='0' and c<='9' ? c-'0' : -1);}#pragma endregion template#line 2 "datastructure/FullyIndexableDictionary.cpp"class FullyIndexableDictionary{int n,block; // 64個事に区切ったブロックの個数vector<unsigned long long> bit;vector<unsigned int> sum; // ブロック毎の累積和bool prepared;public:FullyIndexableDictionary(){}FullyIndexableDictionary(int n):n(n),block((n+63)>>6),bit(block,0),sum(block+1,0),prepared(false){}bool is_prepared(){ return prepared; }void set(int k){bit[k>>6]|=1ull<<(k&63);sum[(k>>6)+1]++;}void build(){assert(!prepared);prepared=true;for(int i=0;i<block;i++)sum[i+1]+=sum[i];}bool operator[](int k)const{return bool((bit[k>>6]>>(k&63))&1);}// [0,j) の合計int rank(int j,bool f=1){assert(prepared);int a=sum[j>>6]+__builtin_popcountll(bit[j>>6]&((1ull<<(j&63))-1));return (f?a:j-a);}// 0-indexed で k 番目の f の場所int select(int k,bool f=1){assert(prepared);if(k<0 or rank(n,f)<=k)return -1;int l=0,r=n;while(r-l>1){int m=(l+r)>>1;(rank(m,f)>=k+1?r:l)=m;}return r-1;}// l以上で k 番目の f の場所int select(int k,bool f,int l){return select(rank(l,f)+k,f);}};#line 2 "util/Compress.cpp"#define ALL_(v) v.begin(),v.end()template<typename T,bool Sentinel=false>class Compress{vector<T> v;bool prepared;public:Compress():prepared(false){if constexpr(Sentinel){v={numeric_limits<T>::min(),numeric_limits<T>::max()};}}Compress(const vector<T>&w):v(w),prepared(false){if constexpr(Sentinel){v.push_back(numeric_limits<T>::min());v.push_back(numeric_limits<T>::max());}build();}void add(T a){assert(!prepared);v.push_back(a);}void build(){assert(!prepared);prepared=true;sort(ALL_(v));v.erase(unique(ALL_(v)),v.end());}bool is_prepared()const{ return prepared; }int operator[](const T&a)const{assert(prepared);auto it=lower_bound(ALL_(v),a);assert(*it==a);return distance(v.begin(),it);}int geq(const T&a)const{assert(prepared);auto it=lower_bound(ALL_(v),a);return distance(v.begin(),it);}int gt(const T&a)const{assert(prepared);auto it=upper_bound(ALL_(v),a);return distance(v.begin(),it);}int leq(const T&a)const{assert(prepared);auto it=--upper_bound(ALL_(v),a);return distance(v.begin(),it);}int lt(const T&a)const{assert(prepared);auto it=--lower_bound(ALL_(v),a);return distance(v.begin(),it);}T r(int id)const{assert(prepared);return v[id];}bool exist(const T&a)const{assert(prepared);return (*lower_bound(ALL_(v),a))==a;}int size()const{return v.size();}};#undef ALL_#line 4 "datastructure/WaveletMatrix.cpp"#define REP_(i,n) for(int i=0;i<(n);i++)template<typename T,bool COMPRESS=true>class WaveletMatrix{using U=conditional_t<COMPRESS,int,T>;static_assert(is_integral_v<U>,"Wavelet Matrix is only for integer");int n,memo,log;vector<FullyIndexableDictionary> mat;vector<int> zero_cnt;Compress<T,true> C;constexpr U comp(const T&x)const{if constexpr(COMPRESS){ return C.geq(x); }else{ return x; }}constexpr T uncomp(const U&a){if constexpr(COMPRESS){ return C.r(a); }else{ return a; }}// 0-indexed で下から i bit 目inline bool low_bit (const U&a,int i)const{ return (a>>i)&1; }// 0-indexed で上から i bit 目inline bool high_bit(const U&a,int i)const{ return low_bit(a,log-i-1); }int nxt(int idx,int h,const U&a){// idx の位置に a があった場合上から h bit 目でどこに行くかbool bit=high_bit(a,h);return mat[h].rank(idx,bit)+(bit?zero_cnt[h]:0);}public:WaveletMatrix(vector<T> v,int log_=0):n(v.size()),log(log_){if constexpr(COMPRESS){C=Compress<T,true>(v);for(T&a:v)a=C[a];while(C.size()>=(1ull<<log))log++;}else{T mx=0;for(const T&a:v){assert(a>=0);if(mx<a)mx=a;}while(mx>=(1ull<<log))log++;}mat.resize(log);zero_cnt.resize(log);vector<U> lv(n),rv(n);REP_(h,log){mat[h]=FullyIndexableDictionary(n);int l=0,r=0;REP_(i,n)if(high_bit(v[i],h)){rv[r++]=v[i];mat[h].set(i);}elselv[l++]=v[i];zero_cnt[h]=l;mat[h].build();swap(lv,v);REP_(i,r)v[l+i]=rv[i];}}// [l,r) の x の個数int rank(int l,int r,const T&x){if constexpr(COMPRESS){if(!C.exist(x))return 0;}U a=comp(x);REP_(h,log){l=nxt(l,h,a);r=nxt(r,h,a);}memo=l;return r-l;}int rank(int r,const T&x){ return rank(x,0,r); }// k 番目の x の indexint select(int k,const T&x){U a=comp(x);if(rank(a,n)<k)return -1;k+=memo;for(int h=log-1;h>=0;h--){bool bit=high_bit(a,h);if(bit)k-=zero_cnt[h];k=mat[h].select(k,bit);}return k;}// [l,r) で 0-indexed k 番目に大きい値T kth_largest(int l,int r,int k){if(k<0 or r-l<=k) return -1;U res=0;REP_(h,log){int L=mat[h].rank(l);int R=mat[h].rank(r);res<<=1;if(R-L>k){l=L+zero_cnt[h];r=R+zero_cnt[h];res++;}else{k-=R-L;l-=L;r-=R;}}return uncomp(res);}T kth_smallest(int l,int r,int k){ return kth_largest(l,r,r-l-k-1); }// [l,r) で x 未満の個数int range_freq(int l,int r,const T&upper){U a=comp(upper);int res=0;REP_(h,log){bool bit=high_bit(a,h);if(bit){res+=r-l;l=nxt(l,h,a);r=nxt(r,h,a);res-=r-l;}else{l=nxt(l,h,a);r=nxt(r,h,a);}}return res;}// [l,r) で [lower,upper) の個数int range_freq(int l,int r,const T&lower,const T&upper){return range_freq(l,r,upper)-range_freq(l,r,lower);}optional<T> lt(int l,int r,const T&x){int cnt=range_freq(l,r,x);if(cnt)return kth_smallest(l,r,cnt-1);return nullopt;}optional<T> leq(int l,int r,const T&x){if(rank(l,r,x))return x;return lt(l,r,x);}optional<T> geq(int l,int r,const T&x){int cnt=r-l-range_freq(l,r,x);if(cnt)return kth_largest(l,r,cnt-1);return nullopt;}optional<T> gt(int l,int r,const T&x){T y;if constexpr(COMPRESS){ y=C.r(C.gt(x)); }else{ y=x+1; }return geq(l,r,y);}};#undef REP_int main(){ios::sync_with_stdio(false);cin.tie(nullptr);INT(n);VI(n,v);WaveletMatrix WM(v);INT(q);REP(q){INT(l,r,x);l--;int ans=2e9;{auto a=WM.leq(l,r,x);chmin(ans,x-a.value_or(-INF));}{auto a=WM.geq(l,r,x);if(a)chmin(ans,a.value_or(INF)-x);}cout<<ans<<"\n";}}