#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; namespace { using Integer = long long; //__int128; template istream& operator >> (istream& is, pair& p){return is >> p.first >> p.second;} template istream& operator >> (istream& is, vector& vec){for(T& val: vec) is >> val; return is;} template istream& operator , (istream& is, T& val){ return is >> val;} template ostream& operator << (ostream& os, const pair& p){return os << p.first << " " << p.second;} template ostream& operator << (ostream& os, const vector& vec){for(size_t i=0; i ostream& operator , (ostream& os, const T& val){ return os << " " << val;} template void print(const H& head){ cout << head; } template void print(const H& head, const T& ... tail){ cout << head << " "; print(tail...); } template void println(const T& ... values){ print(values...); cout << endl; } template void eprint(const H& head){ cerr << head; } template void eprint(const H& head, const T& ... tail){ cerr << head << " "; eprint(tail...); } template void eprintln(const T& ... values){ eprint(values...); cerr << endl; } class range{ Integer start_, end_, step_; public: struct range_iterator{ Integer val, step_; range_iterator(Integer v, Integer step) : val(v), step_(step) {} Integer operator * (){return val;} void operator ++ (){val += step_;} bool operator != (range_iterator& x){return step_ > 0 ? val < x.val : val > x.val;} }; range(Integer len) : start_(0), end_(len), step_(1) {} range(Integer start, Integer end) : start_(start), end_(end), step_(1) {} range(Integer start, Integer end, Integer step) : start_(start), end_(end), step_(step) {} range_iterator begin(){ return range_iterator(start_, step_); } range_iterator end(){ return range_iterator( end_, step_); } }; inline string operator "" _s (const char* str, size_t size){ return move(string(str)); } constexpr Integer my_pow(Integer x, Integer k, Integer z=1){return k==0 ? z : k==1 ? z*x : (k&1) ? my_pow(x*x,k>>1,z*x) : my_pow(x*x,k>>1,z);} constexpr Integer my_pow_mod(Integer x, Integer k, Integer M, Integer z=1){return k==0 ? z%M : k==1 ? z*x%M : (k&1) ? my_pow_mod(x*x%M,k>>1,M,z*x%M) : my_pow_mod(x*x%M,k>>1,M,z);} constexpr unsigned long long operator "" _ten (unsigned long long value){ return my_pow(10,value); } inline int k_bit(Integer x, int k){return (x>>k)&1;} //0-indexed mt19937 mt(chrono::duration_cast(chrono::steady_clock::now().time_since_epoch()).count()); template string join(const vector& v, const string& sep){ stringstream ss; for(size_t i=0; i0) ss << sep; ss << v[i]; } return ss.str(); } inline string operator * (string s, int k){ string ret; while(k){ if(k&1) ret += s; s += s; k >>= 1; } return ret; } } constexpr long long mod = 9_ten + 7; class TrivialBitVector{ public: vector v; vector rank_; vector select_0; vector select_1; TrivialBitVector(vector& v_) : v(v_){ rank_.resize(v.size()+1, 0); for(int i=1; i<=v.size(); i++){ rank_[i] = rank_[i-1] + v[i-1]; } for(int i=0; i= s.size()) return -1; return s[t]; } }; // T = unsigned int / unsigned long long // B = bitvector container type template class WaveletMatrix{ vector m; vector L_size; T lg; //left most bit T mx; const int len; public: WaveletMatrix(vector& v) : len(v.size()){ mx = *max_element(v.begin(), v.end()); lg = 0; while((T(1)< l,r; l.resize(len); iota(l.begin(), l.end(), 0); for(int k=0; k<=lg; k++){ deque l_, r_; vector bits(len); L_size[k] = l.size(); for(int i=0; i> (lg-k))&1; if( (v[ l[i] ] >> (lg-k))&1 ){ r_.push_back( l[i] ); }else{ l_.push_back( l[i] ); } } for(int i=0; i> (lg-k))&1; if( (v[ r[i] ] >> (lg-k))&1 ){ r_.push_back( r[i] ); }else{ l_.push_back( r[i] ); } } swap(l, l_); swap(r, r_); m.emplace_back(bits); /* for(int i=0; i= mx) return ub-lb; return rank_less_than_(q, lb, ub, 0); } //return t-th occurence position of q //if q is not in the list then return -1 int select(T q, int t){ if(q >= (T(1)< quantile(int lb, int ub, int t, int k=0){ if(t >= ub-lb) return {-1,-1}; int val = 0; int pos = lb; int r = m[k].rank(1, ub); int l = m[k].rank(1, lb); if(k==lg){ if(r-l > t){ pos = m[k].select(1, r-1 - t); return {1, pos}; }else{ pos = m[k].select(0, ub-1-t-l ); return {0, pos}; } } if( r-l > t ){ auto tmp = quantile(L_size[k+1] + l, L_size[k+1] + r, t, k+1); val = (T(1)<<(lg-k)) | tmp.first; pos = m[k].select(1, tmp.second - L_size[k+1]); }else{ auto tmp = quantile(lb-l, ub-r, t-(r-l), k+1); val = tmp.first; pos = m[k].select(0, tmp.second); } return {val, pos}; } int quantile_pos(int lb, int ub, int t, int k=0){ if(t >= ub-lb) return -1; int val = 0; int pos = lb; int r = m[k].rank(1, ub); int l = m[k].rank(1, lb); if(k==lg){ if(r-l > t){ return m[k].select(1, r-1 - t); }else{ return m[k].select(0, ub-1-t-l ); } } if( r-l > t ){ auto tmp = quantile_pos(L_size[k+1] + l, L_size[k+1] + r, t, k+1); pos = m[k].select(1, tmp - L_size[k+1]); }else{ auto tmp = quantile_pos(lb-l, ub-r, t-(r-l), k+1); pos = m[k].select(0, tmp); } return pos; } int quantile_val(int lb, int ub, int t, int k=0){ if(t >= ub-lb) return -1; int val = 0; int r = m[k].rank(1, ub); int l = m[k].rank(1, lb); if(k==lg){ if(r-l > t){ return 1; }else{ return 0; } } if( r-l > t ){ auto tmp = quantile_val(L_size[k+1] + l, L_size[k+1] + r, t, k+1); val = (T(1)<<(lg-k)) | tmp; }else{ auto tmp = quantile_val(lb-l, ub-r, t-(r-l), k+1); val = tmp; } return val; } private: //return count of the occurence of q in [0, ub) int rank(T q, int ub, int lb=0, int k=0){ if(q > mx) return 0; //ub = min(len, ub); int bit = (q>>lg-k) & 1; int r = m[k].rank(bit, ub); int l = m[k].rank(bit, lb); if(k==lg) return r - l; if(bit == 0){ return rank(q, r, l, k+1); }else{ return rank(q, L_size[k+1] + r, L_size[k+1] + l, k+1); } } int rank_less_than_(T q, int lb, int ub, int k=0){ if(q >= mx) return ub-lb; int res = 0; int bit = (q>>lg-k) & 1; int r = m[k].rank(bit, ub); int l = m[k].rank(bit, lb); if(bit == 1){ res += ub-lb - (r-l); } if(k==lg) return res + r - l; if(bit == 0){ return res + rank_less_than_(q, l, r, k+1); }else{ return res + rank_less_than_(q, L_size[k+1] + l, L_size[k+1] + r, k+1); } } int select(T q, int t, int lb, int ub, int k){ int bit = (q>>lg-k) & 1; int r = m[k].rank(bit, ub); int l = m[k].rank(bit, lb); if(k==lg){ return (r-l > t) ? m[k].select(bit, l+t) : -1; }else{ if(bit == 0){ t = select(q, t, l,r, k+1); }else{ t = select(q, t, L_size[k+1] + l, L_size[k+1] + r, k+1) - L_size[k+1]; } if(t <= -1) return -1; return m[k].select(bit, t); } } }; int main(){ int n,d,k; cin >> n,d,k; vector x(n); for(int i=0; i w(x); long long ans = -114514893; int ii,jj; // for(int i=0; i dq; for(int i=0; i