Need help , Please! [ Segment Tree problem, complexity analysis ]

Revision en2, by Muhammad_mhs, 2021-08-12 17:10:00

I got this(ADATREE — Ada and Trees) problem from morass blog segment tree section. I stuck to analyzing the both time complexity and memory complexity of this problem in the worst case for this AC solution.

My Solution: ~~~~~ /// BISMILLAHIR RAHMANIR RAHEEM

include<bits/stdc++.h>

using namespace std;

define MUHAMMAD ios::sync_with_stdio(0);cin.tie(0);

define all(x) (x).begin(), (x).end()

using ll = long long; const ll N = 3e5 + 5;

vector < ll > tr[N<<2];

ll n; ll arr[N]; ll q; ll x;

vector < ll > merge( vector a , vector b ){

vector order; while( a.size() and b.size() ){ int x = a.back(); int y = b.back(); if ( x <= y ) { order.push_back ( x ); a.pop_back(); } else { order.push_back ( y ); b.pop_back(); } }

while(a.size()) order.push_back(a.back()) , a.pop_back(); while(b.size()) order.push_back(b.back()) , b.pop_back(); return order; }

void build(ll u, ll st, ll en) {

if (st==en) {
    tr[u].push_back ( arr[st] );
}
else {
    ll mid = (st+en)/2;
    build(2*u, st, mid);
    build(2*u+1, mid+1, en);

    vector < ll > bame = tr[2*u];
    vector < ll > dane = tr[2*u+1];
    reverse ( all ( bame ) );
    reverse ( all ( dane ) );

    vector<ll> res = merge( bame , dane );
    reverse ( all ( res ) );
    while(res.size()){
        tr[u].push_back ( res.back() );
        res.pop_back();
    }
}

}

ll query(ll u, ll st, ll en, ll l, ll r) {

ll bame , dane , res;
if (r<st || en<l)  return 0;     
if (l<=st && en<=r){
    ll lo = st;
    ll hi = en;
    ll mx = 0;
    while(lo<=hi){
        ll mid = (lo+hi)>>1;
        ll cur = tr[u][mid-st];
        if ( cur > x ) hi = mid - 1;
        else{
            lo = mid + 1;
            mx = max ( mx , cur );
        }
    }
    return mx;
}
ll mid = (st+en)/2;
bame = query(2*u, st, mid, l, r);
dane = query(2*u+1, mid+1, en, l, r);

return max(bame,dane);

}

void Solution ( int tc ){

cin >> n >> q; for ( int i = 1 ; i <= n ; ++i ) cin >> arr[i]; build ( 1 , 1 , n ); for ( int i = 1 ; i <= q ; i++ ){ ll l , r; cin >> l >> r >> x; l++; r++; ll res = query ( 1 , 1 , n , l , r ); cout << res << "\n"; } return; }

int main() { MUHAMMAD;

int testcase = 1 , tc = 0;

/// cin >> testcase;

for ( int i = 1 ; i <= testcase ; ++i ){
   Solution( ++tc );
}
return 0;

}

/*

Explanation:

Time :


Alhamdulillah */

~~~~~

Can anyone help me to calculate this. Thanks in advance.

History

 
 
 
 
Revisions
 
 
  Rev. Lang. By When Δ Comment
en3 English Muhammad_mhs 2021-08-12 17:10:44 2 Tiny change: 'ution:**\n~~~~~\n/' -> 'ution:**\n\n~~~~~\n/'
en2 English Muhammad_mhs 2021-08-12 17:10:00 53
en1 English Muhammad_mhs 2021-08-12 17:02:27 3072 Initial revision (published)