#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef long long ll; typedef vector vi; typedef pair pii; #define MP make_pair #define PB push_back #define inf 1000000007 #define rep(i,n) for(int i = 0; i < (int)(n); ++i) #define all(x) (x).begin(),(x).end() template void Fill(A (&array)[N], const T &val){ std::fill( (T*)array, (T*)(array+N), val ); } template inline bool chmax(T &a, T b){ if(a inline bool chmin(T &a, T b){ if(a>b){ a = b; return true; } return false; } template class segtree{ private: int n,sz; vector node; public: segtree(const vector& v) : n(1), sz((int)v.size()){ while(n < sz) n *= 2; node.resize(2*n-1, numeric_limits::max()); for(int i = 0; i < sz; i++){ node[i+n-1] = v[i]; } for(int i=n-2; i>=0; i--){ node[i] = min(node[i*2+1], node[i*2+2]); } } void update(int k,T a){ k += n-1; node[k] = a; while(k>0){ k = (k-1)/2; node[k] = min(node[2*k+1],node[2*k+2]); } } T query(int a,int b,int k=0,int l=0,int r=-1){ if(r < 0) r = n; if(r <= a || b <= l){ return numeric_limits::max(); } if(a <= l && r <= b){ return node[k]; }else{ T vl = query(a,b,2*k+1,l,(l+r)/2); T vr = query(a,b,2*k+2,(l+r)/2,r); return min(vl,vr); } } void print(){ for(int i = 0; i < sz; i++){ cout< class segtree2{ private: int n,sz; vector node; public: segtree2(const vector& v) : n(1), sz((int)v.size()){ while(n < sz) n *= 2; node.resize(2*n-1, numeric_limits::min()); for(int i = 0; i < sz; i++){ node[i+n-1] = v[i]; } for(int i=n-2; i>=0; i--){ node[i] = max(node[i*2+1], node[i*2+2]); } } void update(int k,T a){ k += n-1; node[k] = a; while(k>0){ k = (k-1)/2; node[k] = max(node[2*k+1],node[2*k+2]); } } T query(int a,int b,int k=0,int l=0,int r=-1){ if(r < 0) r = n; if(r <= a || b <= l){ return numeric_limits::min(); } if(a <= l && r <= b){ return node[k]; }else{ T vl = query(a,b,2*k+1,l,(l+r)/2); T vr = query(a,b,2*k+2,(l+r)/2,r); return max(vl,vr); } } void print(){ for(int i = 0; i < sz; i++){ cout<> n; vectora(n); rep(i,n)cin >> a[i]; int q; cin >> q; vector,pair > > query; rep(zz,q){ int l,r,x; cin >> l >> r >> x; query.push_back(MP(MP(x,zz),MP(l-1,r))); } vector,pair> > v; rep(i,n){ v.push_back(MP(MP(a[i],-1),MP(i,0))); } rep(i,q){ v.push_back(query[i]); } sort(all(v)); vectorp(n,-(1LL<<60)); segtree2 seg(p); vector res(q,1LL<<60); rep(i,n+q){ if(v[i].first.second==-1){ seg.update(v[i].second.first,v[i].first.first); }else{ chmin(res[v[i].first.second],v[i].first.first -seg.query(v[i].second.first,v[i].second.second)); } } vectorqq(n,(1LL<<60)); segtree segg(qq); reverse(all(v)); rep(i,n+q){ if(v[i].first.second==-1){ segg.update(v[i].second.first,v[i].first.first); }else{ chmin(res[v[i].first.second],segg.query(v[i].second.first,v[i].second.second)-v[i].first.first); } } rep(i,q){ cout << res[i] << "\n"; } return 0; }