結果
問題 | No.2809 Sort Query |
ユーザー |
|
提出日時 | 2024-07-13 01:54:48 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 1,106 ms / 2,000 ms |
コード長 | 6,047 bytes |
コンパイル時間 | 2,354 ms |
コンパイル使用メモリ | 124,796 KB |
実行使用メモリ | 48,720 KB |
最終ジャッジ日時 | 2024-07-13 01:55:52 |
合計ジャッジ時間 | 62,602 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 71 |
ソースコード
#include <iostream>#include <vector>#include <queue>#include <algorithm>using namespace std;using ll = long long;constexpr int iINF = 1'000'000'000;constexpr ll llINF = 1'000'000'000'000'000'000;// https://github.com/dyktr06/kyopro_library/blob/main/lib/data_structure/priority_set.hpp// thank you very much dyktr_06template <typename T>struct PrioritySet{struct compress{vector<T> sorted, compressed;compress(){}void init(const vector<T> &vec){int n = vec.size();compressed.resize(n);for(T x : vec){sorted.emplace_back(x);}sort(sorted.begin(), sorted.end());sorted.erase(unique(sorted.begin(), sorted.end()), sorted.end());for(int i = 0; i < n; ++i){compressed[i] = lower_bound(sorted.begin(), sorted.end(), vec[i]) - sorted.begin();}}int get(const T &x) const{return lower_bound(sorted.begin(), sorted.end(), x) - sorted.begin();}T inv(const T &x) const{return sorted[x];}size_t size() const{return sorted.size();}vector<T> getCompressed() const{return compressed;}};struct BinaryIndexedTree{int N;vector<T> BIT;BinaryIndexedTree() {}void init(int size){N = size;BIT.assign(N + 1, 0);}T get(int i){return sum(i + 1) - sum(i);}void add(int i, T x){i++;while(i <= N){BIT[i] += x;i += i & -i;}}T sum(int i) const {T ans = 0;while(i > 0){ans += BIT[i];i -= i & -i;}return ans;}T sum(int L, int R) const {return sum(R) - sum(L);}int lower_bound(T x) const {if(x <= 0){return 0;} else{int v = 0, r = 1;while(r < N) r = r << 1;for(int len = r; len > 0; len = len >> 1){if(v + len < N && BIT[v + len] < x){x -= BIT[v + len];v += len;}}return v;}}int upper_bound(T x) const {if(x < 0){return 0;} else{int v = 0, r = 1;while(r <= N) r = r << 1;for(int len = r; len > 0; len = len >> 1){if(v + len <= N && BIT[v + len] <= x){x -= BIT[v + len];v += len;}}return v;}}T operator [](int i) const {return sum(i, i + 1);}};vector<T> a;compress comp;BinaryIndexedTree cnt, val;PrioritySet(){ }void add(T x){a.push_back(x);}void build(){comp.init(a);cnt.init(comp.size());val.init(comp.size());}T size(){return cnt.sum((int) comp.size());}void insert(T x, T count = 1){cnt.add(comp.get(x), count);val.add(comp.get(x), count * x);}void erase(T x, T count = 1){T idx = comp.get(x);if(cnt.get(idx) < count){count = cnt.get(idx);}cnt.add(idx, -count);val.add(idx, -count * x);}// 1-indexedT kth_small_element(T k){T idx = cnt.lower_bound(k);return comp.inv(idx);}T kth_large_element(T k){T rev_k = size() - k + 1;return kth_small_element(rev_k);}// 1-indexedT kth_small_sum(T k){if(size() < k){return val.sum((int) comp.size());}T idx = cnt.lower_bound(k);T sum = val.sum(idx);sum += comp.inv(idx) * (k - cnt.sum(idx));return sum;}T kth_large_sum(T k){if(size() < k){return val.sum((int) comp.size());}T rev_k = size() - k;return val.sum((int) comp.size()) - kth_small_sum(rev_k);}};int main () {int N, Q; cin >> N >> Q;vector<ll> A(N);for (int i = 0; i < N; i++) cin >> A[i];PrioritySet<ll> ps;for (int i = 0; i < N; i++) ps.add(A[i]);vector<int> t(Q), k(Q);vector<ll> x(Q);for (int i = 0; i < Q; i++) {cin >> t[i];if (t[i] == 1) {cin >> k[i] >> x[i];k[i]--;ps.add(x[i]);}if (t[i] == 3) {cin >> k[i];k[i]--;}}ps.build();for (int i = 0; i < N; i++) ps.insert(A[i]);queue<int> que;vector<bool> changed(N, true);for (int i = 0; i < N; i++) que.push(i);bool sorted = false;vector<ll> B = A;vector<ll> remove, add;for (int i = 0; i < Q; i++) {if (t[i] == 1) {if (!changed[k[i]]) que.push(k[i]);changed[k[i]] = true;B[k[i]] = x[i];}if (t[i] == 2) {while (!que.empty()) {int id = que.front();que.pop();ll r = A[id];if (sorted) r = ps.kth_small_element(id + 1);remove.push_back(r);add.push_back(B[id]);changed[id] = false;}for (auto v : remove) ps.erase(v);for (auto v : add) ps.insert(v);remove.resize(0);add.resize(0);sorted = true;}if (t[i] == 3) {if (changed[k[i]]) {cout << B[k[i]] << "\n";}else {cout << ps.kth_small_element(k[i] + 1) << "\n";}}}}