#include using namespace std; #define ALL(a) (a).begin(),(a).end() #define ALLR(a) (a).rbegin(),(a).rend() #define spa << " " << #define lfs <= (ll)(m); i--) typedef long long ll; typedef long double ld; const ll MOD = 1e9+7; //const ll MOD = 998244353; const ll INF = 1e18; using P = pair; template void chmin(T &a,T b){if(a>b)a=b;} template void chmax(T &a,T b){if(a void ans(bool x,T1 y,T2 z){if(x)cout< void debug(vector>v,ll h,ll w){for(ll i=0;iv,ll h,ll w){for(ll i=0;i void debug(vectorv,ll n){cout< vector>vec(ll x, ll y, T w){ vector>v(x,vector(y,w));return v;} ll gcd(ll x,ll y){ll r;while(y!=0&&(r=x%y)!=0){x=y;y=r;}return y==0?x:y;} template void emp(map&m, T x){m.emplace(x,0).first->second++;} template struct SegmentTree{ using F = function; vector data; ll n,lastlen = 1; F func = [](T a, T b){return a > b ? a : b;}; T iden = 0; //identity element SegmentTree(vector v){ n = (ll)v.size(); while(lastlen < n)lastlen *= 2; data.assign(lastlen*2-1,iden); for(ll i=0;i=0;i--){ data[i] = func(data[2*i+1], data[2*i+2]); } } void update(ll point, T x){ point+=lastlen-1; data[point] = x; while(point!=0){ point=(point-1)/2; data[point]=func(data[2*point+1],data[2*point+2]); } } T query(ll a,ll b,ll point=0,ll left=0,ll right=-1){ if(right<0)right=lastlen; T ret = iden; if(b <= left || right <= a); else if(a <= left && right <= b ){ ret = func(ret, data[point]); } else{ T p,q; p = query(a,b,point*2+1,left, (left+right)/2); q = query(a,b,point*2+2,(left+right)/2, right); ret = func(ret,p); ret = func(ret,q); } return ret; } T lower_bound(ll p,ll x){ ll sumbuf=iden, l=p,r=p+1; p = p + lastlen - 1; while(1){ if(func(sumbuf,data[p]) < x){ if(p%2==1){ p = (p-1)/2; r = l + (r-l)*2; } else if(r>=n){ return n; } else{ func(sumbuf,data[p]); p >>= 1; ll x = r + (r-l)*2; l = r; r = x; } } else if(p >= lastlen - 1)return r - 1; else if(func(sumbuf,data[2*p+1]) < x){ sumbuf = func(sumbuf, data[2*p+1]); p = 2*p+2; l = (r+l)/2; } else{ p = 2*p+1; r = (r+l)/2; } } } }; template struct BIT{ ll n; ll k=1; vectordata; BIT(ll size):n(size){ data.assign(n,0); while(k*2<=n)k*=2; } void add(ll a,T w){ for(ll i=a+1;i<=n;i+=i&-i)data[i-1]+=w; } T sum(ll a){ T ret = 0; for(ll i=a+1;i>0;i-=i&-i)ret+=data[i-1]; return ret; } T sum(ll a,ll b){return a==0?sum(b):sum(b)-sum(a-1);} ll lower_bound(ll x){ ll ret=0; for(ll i=k;i>0;i/=2){ if(ret+i<=n&&data[ret+i-1]>n>>q; vectora(n); rep(i,0,n)cin>>a[i]; auto b=a; reverse(ALL(b)); vector>r(q); rep(i,0,q){ ll k;cin>>k; ll x,y;cin>>x>>y; r[i].fi.se=x-1; r[i].fi.fi=y-1; r[i].se=i; } sort(ALL(r)); SegmentTreesegtree(b); BITbit(n); ll idx=0; vectorret(q); rep(i,0,q){ while(idx