线段树套平板电视40pts求调

P3380 【模板】树套树

注意upper_bound的使用方式,目前没时间调,你可以看看我写的pbds ```cpp #include <bits/stdc++.h> #include <bits/extc++.h> #define ll long long #define m_p(a, b) make_pair(a, b) #define N 100010 using namespace std; using namespace __gnu_pbds; tree<pair<ll, ll>, null_type, less<pair<ll, ll>>, rb_tree_tag, tree_order_statistics_node_update> tr[N << 1]; ll n, val[N], multimode = 1, tmax = 0, trm[N << 1]; void build(ll x, ll l, ll r){ if (l == r){ tr[x].insert(m_p(val[l], multimode++)); trm[x] = val[l]; return; } for (ll i = l; i <= r; i++)tr[x].insert(m_p(val[i], multimode++)); ll mid = l + r >> 1; build(x << 1, l, mid); build(x << 1 | 1, mid + 1, r); trm[x] = max(trm[x << 1], trm[x << 1 | 1]); } ll rk_ask(ll k, ll x, ll y, ll l, ll r, pair<ll, ll> w){ if (x > r || y < l)return 0; if (x >= l && y <= r)return tr[k].order_of_key(w); ll mid = x + y >> 1, ans = 0; if (l <= mid)ans += rk_ask(k << 1, x, mid, l, r, w); if (r > mid)ans += rk_ask(k << 1 | 1, mid + 1, y, l, r, w); return ans; } ll kth_num(ll l, ll r, ll k){ ll _l = 0, _r = tmax + 1, mid = _l + _r >> 1, ans, kt; while (_l < _r){ kt = rk_ask(1, 1, n, l, r, m_p(mid, multimode + 1)); (kt < k) ? _l = mid + 1 : _r = mid; mid = _l + _r >> 1; } return _l; } void tr_c(ll x, ll l, ll r, ll k, ll w,pair<ll,ll>cw){ if (l > k || r < k) return; if (l == r && l == k){ trm[x] = w; tr[x].erase(tr[x].begin()); tr[x].insert(m_p(w, ++multimode)); return; } ll mid = l + r >> 1; tr[x].erase(tr[x].lower_bound(cw)); tr[x].insert(m_p(w, ++multimode)); (mid >= k) ? tr_c(x << 1, l, mid, k, w,cw) : tr_c(x << 1 | 1, mid + 1, r, k, w,cw); trm[x] = max(trm[x << 1], trm[x << 1 | 1]); } ll mx(bool ty, ll a, ll b){ return ty ? ((a > b) ? a : b) : ((a < b) ? a : b); } ll pn_ask(ll k, ll x, ll y, ll l, ll r, ll w, bool ty){ if (x > r || y < l)return 0; if (x >= l && y <= r){ auto it = tr[k].lower_bound(m_p(w, ty ? 0 : multimode + 1)); return ((ty ? --it : it) == tr[k].end()) ? (ty ? -2147483647 : INT_MAX) : (it->first); } ll mid = x + y >> 1, ans = ty ? -2147483647 : INT_MAX; if (l <= mid) ans = mx(ty, pn_ask(k << 1, x, mid, l, r, w, ty), ans); if (r > mid) ans = mx(ty, pn_ask(k << 1 | 1, mid + 1, y, l, r, w, ty), ans); return ans; } int main(){ ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); ll m, opt, l, r, k, ans; cin >> n >> m; for (ll i = 1; i <= n; i++){ cin >> val[i]; tmax = max(tmax, val[i]); } build(1, 1, n); while (m--){ cin >> opt >> l >> r; if (opt != 3){ cin >> k; ans = (opt == 1) ? (rk_ask(1, 1, n, l, r, m_p(k, 0)) + 1) : ((opt == 2) ? (kth_num(l, r, k)) : (pn_ask(1, 1, n, l, r, k, (opt == 4)))); cout << ans << endl; } else{ tr_c(1, 1, n, l, r,m_p(val[l], 0)); tmax = trm[1]; val[l] = r; } } return 0; } ```
by _WRYYY_ @ 2023-10-31 17:36:31


|