structBIT { /* ======================================== */ ll tr[maxn]; int sz; voidinit( int N ){ sz = N; fill( tr, tr + sz + 2, 0 ); } voidadd( int idx, ll val ){ for( int i = idx; i <= sz; i += i & -i ) tr[i] += val; } ll ask( int idx ){ ll res = 0; for( int i = idx; i; i -= i & -i ) res += tr[i]; return res; } ll ask( int l, int r ){ returnask( r ) - ask( l - 1 ); } /* ======================================== */ } bit;
structPoint { int x, y; } ps[maxn];
structQuery { int l, r, x, idx; } qs[maxn];
int a[maxn]; int ans[maxn];
voidsolve( ){ int n = read( ), m = read( );
for( int i = 1; i <= n; ++ i ) { a[i] = read( ); ps[i] = { i, a[i] }; }
for( int i = 1; i <= m; ++ i ) { qs[i].l = read( ), qs[i].r = read( ); qs[i].x = read( ), qs[i].idx = i; }
sort( ps + 1, ps + n + 1, []( Point A, Point B ) { return A.y < B.y; } );
sort( qs + 1, qs + m + 1, []( Query A, Query B ) { return A.x < B.x; } );
bit.init( n ); int cur = 1;
for( int i = 1; i <= m; ++ i ) { auto [ql, qr, qx, idx] = qs[i]; while( cur <= n && ps[cur].y <= qx ) { bit.add( ps[cur].x, 1 ); ++ cur; } ans[idx] = bit.ask( ql, qr ); }
for( int i = 1; i <= m; ++ i ) { cout << ans[i] << '\n'; } }
structDisc { /* ======================================== */ vector<int> v; voidclear( ){ v.clear( ); } voidadd( int x ){ v.push_back( x ); } voidinit( ){ sort( v.begin( ), v.end( ) ); v.erase( unique( v.begin( ), v.end( ) ), v.end( ) ); } intsize( ){ return v.size( ); } intget_idx( int x ){ returnlower_bound( v.begin( ), v.end( ), x ) - v.begin( ) + 1; } intget_leq_idx( int x ){ returnupper_bound( v.begin( ), v.end( ), x ) - v.begin( ); } intget_val( int idx ){ return v[idx - 1]; } /* ======================================== */ } disc;
structBIT { /* ======================================== */ ll tr[maxn]; int sz; voidinit( int N ){ sz = N; fill( tr, tr + sz + 2, 0 ); } voidadd( int idx, ll val ){ for( int i = idx; i <= sz; i += i & -i ) tr[i] += val; } ll ask( int idx ){ ll res = 0; for( int i = idx; i; i -= i & -i ) res += tr[i]; return res; } ll ask( int l, int r ){ returnask( r ) - ask( l - 1 ); } /* ======================================== */ } bit;
structEvent { int x, y, idx, opt; } es[maxn << 1];
int a[maxn]; int ans[maxn];
voidsolve( ){ int n = read( ), m = read( );
for( int i = 1; i <= n; ++ i ) { a[i] = read( ); disc.add( a[i] ); } disc.init( );
int ecnt = 0; for( int i = 1; i <= m; ++ i ) { int l = read( ), r = read( ), x = read( ); int rk = disc.get_leq_idx( x ); es[++ ecnt] = { r, rk, i, 1 }; es[++ ecnt] = { l - 1, rk, i, -1 }; }
sort( es + 1, es + ecnt + 1, []( Event A, Event B ) { return A.x < B.x; } );
bit.init( disc.size( ) ); int cur = 0;
for( int i = 1; i <= ecnt; ++ i ) { auto [x, y, idx, opt] = es[i]; while( cur < x ) { ++ cur; int idx = disc.get_idx( a[cur] ); bit.add( idx, 1 ); } ans[idx] += opt * bit.ask( y ); }
for( int i = 1; i <= m; ++ i ) { cout << ans[i] << '\n'; } }