#include using namespace std; using ll=long long; using ull=unsigned long long; using P=pair; templateusing minque=priority_queue,greater>; templatebool chmax(T &a,const T &b){return (abool chmin(T &a,const T &b){return (a>b?(a=b,true):false);} templateistream &operator>>(istream &is,pair&p){is>>p.first>>p.second;return is;} templateistream &operator>>(istream &is,tuple&a){is>>std::get<0>(a)>>std::get<1>(a)>>std::get<2>(a);return is;} templateistream &operator>>(istream &is,array&a){for(auto&i:a)is>>i;return is;} templateistream &operator>>(istream &is,vector &a){for(auto &i:a)is>>i;return is;} templatevoid operator++(pair&a,int n){a.first++,a.second++;} templatevoid operator--(pair&a,int n){a.first--,a.second--;} templatevoid operator++(vector&a,int n){for(auto &i:a)i++;} templatevoid operator--(vector&a,int n){for(auto &i:a)i--;} #define overload3(_1,_2,_3,name,...) name #define rep1(i,n) for(int i=0;i<(int)(n);i++) #define rep2(i,l,r) for(int i=(int)(l);i<(int)(r);i++) #define rep(...) overload3(__VA_ARGS__,rep2,rep1)(__VA_ARGS__) #define reps(i,l,r) rep2(i,l,r) #define all(x) x.begin(),x.end() #define pcnt(x) __builtin_popcountll(x) #define fin(x) return cout<<(x)<<'\n',static_cast(0) #define yn(x) cout<<((x)?"Yes\n":"No\n") #define uniq(x) sort(all(x)),x.erase(unique(all(x)),x.end()) template inline int fkey(vector&z,T key){return lower_bound(z.begin(),z.end(),key)-z.begin();} ll myceil(ll a,ll b){return (a+b-1)/b;} template auto vec(const int (&d)[n],const T &init=T()){ if constexpr (id(d,init)); else return init; } #ifdef LOCAL #include #define SWITCH(a,b) (a) #else #define debug(...) static_cast(0) #define debugg(...) static_cast(0) #define SWITCH(a,b) (b) templateostream &operator<<(ostream &os,const pair&p){os<>testcase; for(int i=0;i #include template constexpr std::enable_if_t::digits<=32,int>msb(T n){return n==0?-1:31-__builtin_clz(n);} template constexpr std::enable_if_t<(std::numeric_limits::digits>32),int>msb(T n){return n==0?-1:63-__builtin_clzll(n);} template constexpr std::enable_if_t::digits<=32,int>lsb(T n){return n==0?-1:__builtin_ctz(n);} template constexpr std::enable_if_t<(std::numeric_limits::digits>32),int>lsb(T n){return n==0?-1:__builtin_ctzll(n);} template constexpr std::enable_if_t,T>floor_pow2(T n){return n==0?0:T(1)< constexpr std::enable_if_t,T>ceil_pow2(T n){return n<=1?1:T(1)<<(msb(n-1)+1);} template constexpr T safe_div(T a,T b){return a/b-(a%b&&(a^b)<0);} template constexpr T safe_ceil(T a,T b){return a/b+(a%b&&(a^b)>0);} struct VanEmdeBoasTree{ private: int n; int l,r; int s,sl; int mask; using u64=uint64_t; struct veb3{ u64 aux=0; inline void insert(int x){aux|=u64(1)<>x; return sh==0?64:x+__builtin_ctzll(sh); } inline bool contains(int x)const{return aux>>x&1;} }; struct veb2{ int l,r; int s,sl; int mask; int mn,mx; std::vectorchild; veb3 aux; veb2(){} veb2(int log2n):l(log2n/2),r((log2n+1)/2),s(1<=mx)return; } else if(x>=mx){ if(x==mx)return; std::swap(x,mx); if(x<=mn)return; } int nx=x>>r; if(child[nx].empty())aux.insert(nx); child[nx].insert(x&mask); } void erase(int x){ if(x<=mn){ if(x=mx){ if(x>mx)mx=-1; return; } } else if(x>=mx){ if(x>mx)return; x=mx=predecessor(mx-1); if(x<=mn)return; } int nx=x>>r; child[nx].erase(x&mask); if(child[nx].empty())aux.erase(nx); } bool empty()const{return mx=mx)return mx; if(x>r; int res=child[nx].predecessor(x&mask); if(res>=0)return (nx<mx)return s; int nx=x>>r; int res=child[nx].successor(x&mask); if(res<=mask)return (nx<=sl?mx:((nx<child; veb2 aux; int mn,mx; int N; public: VanEmdeBoasTree():mn(0),mx(-1){} VanEmdeBoasTree(int n):N(n){ if(n<16)n=16; n=ceil_pow2(n); int log2n=msb(n); assert(n<=(1<<24)); mn=-1; mx=n; l=log2n/2,r=(log2n+1)/2; s=1<=mx)return; } else if(x>=mx){ if(x==mx)return; std::swap(x,mx); if(x<=mn)return; } int nx=x>>r; if(child[nx].empty())aux.insert(nx); child[nx].insert(x&mask); } void erase(int x){ if(x<=mn){ if(x=mx){ if(x>mx)mx=-1; return; } } else if(x>=mx){ if(x>mx)return; x=mx=predecessor(mx-1); if(x<=mn)return; } int nx=x>>r; child[nx].erase(x&mask); if(child[nx].empty())aux.erase(nx); } void clear(){ mn=s,mx=-1; for(int i=0;i=mx)return mx; if(x>r; int res=child[nx].predecessor(x&mask); if(res>=0)return (nx<mx)return N; int nx=x>>r; int res=child[nx].successor(x&mask); if(res<=mask)return std::min(N,(nx<=sl?mx:((nx<mo_order(int n,const std::vector>&query){ int z=ceil_pow2(n+1); auto hilbert=[&](int x,int y)->long long { long long rx,ry,res=0; for(long long s=z>>1;s;s>>=1){ rx=(x&s)>0,ry=(y&s)>0; res+=s*s*((rx*3)^ry); if(ry)continue; if(rx){ x=z-1-x; y=z-1-y; } std::swap(x,y); } return res; }; std::vectorh(query.size()); for(int i=0;i<(int)query.size();i++)h[i]=hilbert(query[i].first,query[i].second); std::vectorord(query.size()); std::iota(ord.begin(),ord.end(),0); std::sort(ord.begin(),ord.end(),[&](int lhs,int rhs){return h[lhs]>Q; public: Mo(int N):n(N){ z=1; while(z<=n)z<<=1; } void add(int l,int r){ Q.emplace_back(l,r); } public: void build(const auto &add,const auto &del,const auto &out){ int q=Q.size(); std::vectorord=mo_order(n,Q); int l=0,r=0; for(int i:ord){ if(Q[i].first>n>>q; vectora(n); cin>>a; int mx=*max_element(all(a)); a--; VanEmdeBoasTree veb(mx),diff(mx); vectorcnt(mx),cntdiff(mx); Mo mo(n); vector>query(q); rep(i,q){ int l,r,x; char c; cin>>l>>r>>x>>c; l--; mo.add(l,r); query[i]={x,c}; } vectorans(q); int sz=0; #define ADD(x)\ if(++cntdiff[x]==1)diff.insert(x); #define ERASE(x)\ if(--cntdiff[x]==0)diff.erase(x); auto add=[&](int l,int r){ if(sz==0){ cnt[a[l]]++; veb.insert(a[l++]); sz++; } rep(i,l,r){ int pre=veb.predecessor(a[i]); int nxt=veb.successor(a[i]+1); if(++cnt[a[i]]==1)veb.insert(a[i]); if(pre!=-1&&nxt=mx){ ans[i]=-1; return; } ans[i]=diff.successor(x); if(ans[i]>=mx)ans[i]=-1; } }; mo.build(add,erase,out); rep(i,q)cout<