#include #define rep(i,n) for(int i=0;i<(int)(n);i++) #define FOR(i,n,m) for(int i=(int)(n); i<=(int)(m); i++) #define RFOR(i,n,m) for(int i=(int)(n); i>=(int)(m); i--) #define ITR(x,c) for(__typeof(c.begin()) x=c.begin();x!=c.end();x++) #define RITR(x,c) for(__typeof(c.rbegin()) x=c.rbegin();x!=c.rend();x++) #define setp(n) fixed << setprecision(n) template bool chmax(T &a, const T &b) { if (a bool chmin(T &a, const T &b) { if (a>b) { a=b; return 1; } return 0; } #define ll long long #define vll vector #define vi vector #define pll pair #define pi pair #define all(a) (a.begin()),(a.end()) #define rall(a) (a.rbegin()),(a.rend()) #define fi first #define se second #define pb push_back #define ins insert #define debug(a) cerr<<(a)< ostream &operator<<(ostream &os, const pair &p){return os<<"("< istream &operator>>(istream &is, pair &p){return is>>p.fi>>p.se;} //------------------------------------------------- //--Wavelet Matrix //------------------------------------------------- class bit_vector { private: static constexpr size_t BITS = 6; static constexpr size_t UMASK = (1<>BITS)+1){ sum = (int*)malloc(nchunks*sizeof(int)); dat = (uint64_t*)malloc(nchunks*sizeof(uint64_t)); memset(dat,0,nchunks*sizeof(uint64_t)); } inline void set(const int k){dat[k>>BITS]|=1ULL<<(k&UMASK);} inline void build(){ sum[0]=0ULL; for(size_t i=1; i!=nchunks; i++){ sum[i]=sum[i-1]+__builtin_popcountll(dat[i-1]); } } inline int rank1(const int k){ return sum[k>>BITS] + __builtin_popcountll(dat[k>>BITS]&~(UINT64_MAX<<(k&UMASK))); } inline int rank0(const int k){return k-rank1(k);} inline bool operator[](const int k){return dat[k>>BITS]>>(k&UMASK)&1;}; }; template class WaveletMatrix { private: bit_vector *vs[MAXLOG]; int r0[MAXLOG]; inline int next_idx(const int k, bool f, int i){ return f ? vs[i]->rank1(k)+r0[i] : vs[i]->rank0(k); } public: template WaveletMatrix(E v){ const size_t N = v.size(); E left(N),right(N); for(int i=MAXLOG-1; i>=0; i--){ vs[i] = new bit_vector(N); size_t l=0,r=0; for(size_t j=0; j>i&1) vs[i]->set(j), right[r++]=v[j]; else left[l++]=v[j]; } vs[i]->build(); r0[i] = l; v.swap(left); for(size_t j=0; j(0); for(int i=MAXLOG-1; i>=0; i--){ const bool f = (*vs[i])[k]; ret |= static_cast(f)<=0; i--){ const bool f = (x>>i&1); l = next_idx(l,f,i); r = next_idx(r,f,i); } return r-l; } inline int rank(const int k, const T x){return rank(0,k,x);} T quantile(int l, int r, int k){ T ret=static_cast(0); for(int i=MAXLOG-1; i>=0; i--){ const int c0_l = vs[i]->rank0(l); const int c0_r = vs[i]->rank0(r); const int c0 = c0_r-c0_l; const bool f = (c0>k)?(false):(k-=c0,true); ret |= static_cast(f)<>N>>Q; string S; cin>>S; vi vec(N); rep(i,N) vec[i] = S[i]-'a'; WaveletMatrix wm(vec); while(Q--){ int l,r,x; cin>>l>>r>>x; l--; x--; int res = wm.quantile(l,r,x); cout<<(char)(res+'a')<<"\n"; } return 0; }