結果

問題 No.2809 Sort Query
ユーザー RubikunRubikun
提出日時 2024-07-12 22:21:52
言語 C++17
(gcc 12.3.0 + boost 1.83.0)
結果
AC  
実行時間 663 ms / 2,000 ms
コード長 16,606 bytes
コンパイル時間 2,712 ms
コンパイル使用メモリ 219,008 KB
実行使用メモリ 45,480 KB
最終ジャッジ日時 2024-07-12 22:23:30
合計ジャッジ時間 39,272 ms
ジャッジサーバーID
(参考情報)
judge6 / judge4
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
5,248 KB
testcase_01 AC 455 ms
32,940 KB
testcase_02 AC 426 ms
32,936 KB
testcase_03 AC 407 ms
32,940 KB
testcase_04 AC 385 ms
32,944 KB
testcase_05 AC 413 ms
32,912 KB
testcase_06 AC 289 ms
30,640 KB
testcase_07 AC 262 ms
30,636 KB
testcase_08 AC 256 ms
30,764 KB
testcase_09 AC 273 ms
30,404 KB
testcase_10 AC 261 ms
30,636 KB
testcase_11 AC 307 ms
40,488 KB
testcase_12 AC 294 ms
40,620 KB
testcase_13 AC 309 ms
40,492 KB
testcase_14 AC 330 ms
40,492 KB
testcase_15 AC 330 ms
40,620 KB
testcase_16 AC 350 ms
40,620 KB
testcase_17 AC 321 ms
40,748 KB
testcase_18 AC 294 ms
40,620 KB
testcase_19 AC 302 ms
40,620 KB
testcase_20 AC 297 ms
40,748 KB
testcase_21 AC 649 ms
45,480 KB
testcase_22 AC 620 ms
45,232 KB
testcase_23 AC 663 ms
45,356 KB
testcase_24 AC 613 ms
45,360 KB
testcase_25 AC 617 ms
45,356 KB
testcase_26 AC 478 ms
38,316 KB
testcase_27 AC 508 ms
38,188 KB
testcase_28 AC 489 ms
38,184 KB
testcase_29 AC 520 ms
38,108 KB
testcase_30 AC 478 ms
38,064 KB
testcase_31 AC 223 ms
34,732 KB
testcase_32 AC 259 ms
34,732 KB
testcase_33 AC 236 ms
34,728 KB
testcase_34 AC 234 ms
34,724 KB
testcase_35 AC 230 ms
34,736 KB
testcase_36 AC 273 ms
40,620 KB
testcase_37 AC 251 ms
40,620 KB
testcase_38 AC 245 ms
40,616 KB
testcase_39 AC 243 ms
40,624 KB
testcase_40 AC 250 ms
40,744 KB
testcase_41 AC 424 ms
31,240 KB
testcase_42 AC 429 ms
31,260 KB
testcase_43 AC 424 ms
31,232 KB
testcase_44 AC 436 ms
31,360 KB
testcase_45 AC 478 ms
31,360 KB
testcase_46 AC 408 ms
31,360 KB
testcase_47 AC 407 ms
31,360 KB
testcase_48 AC 414 ms
31,436 KB
testcase_49 AC 418 ms
31,360 KB
testcase_50 AC 410 ms
31,324 KB
testcase_51 AC 428 ms
31,360 KB
testcase_52 AC 176 ms
31,404 KB
testcase_53 AC 244 ms
31,304 KB
testcase_54 AC 199 ms
31,360 KB
testcase_55 AC 259 ms
31,356 KB
testcase_56 AC 296 ms
25,608 KB
testcase_57 AC 256 ms
22,560 KB
testcase_58 AC 242 ms
20,672 KB
testcase_59 AC 284 ms
24,200 KB
testcase_60 AC 236 ms
20,524 KB
testcase_61 AC 311 ms
25,160 KB
testcase_62 AC 279 ms
21,756 KB
testcase_63 AC 292 ms
26,332 KB
testcase_64 AC 344 ms
29,568 KB
testcase_65 AC 179 ms
17,944 KB
testcase_66 AC 2 ms
5,376 KB
testcase_67 AC 2 ms
5,376 KB
testcase_68 AC 1 ms
5,376 KB
testcase_69 AC 1 ms
5,376 KB
testcase_70 AC 2 ms
5,376 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
template<class T>bool chmax(T &a, const T &b) { if (a<b) { a=b; return true; } return false; }
template<class T>bool chmin(T &a, const T &b) { if (b<a) { a=b; return true; } return false; }
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define mp make_pair
#define si(x) int(x.size())
const int mod=998244353,MAX=300005,INF=15<<26;

// BIT セグ木 遅延セグ木 のみ

// from: https://gist.github.com/yosupo06/ddd51afb727600fd95d9d8ad6c3c80c9
// (based on AtCoder STL)

#include <algorithm>
#include <array>
#ifdef _MSC_VER
#include <intrin.h>
#endif
namespace atcoder {
    namespace internal {
        int ceil_pow2(int n) {
            int x = 0;
            while ((1U << x) < (unsigned int)(n)) x++;
            return x;
        }
        int bsf(unsigned int n) {
#ifdef _MSC_VER
            unsigned long index;
            _BitScanForward(&index, n);
            return index;
#else
            return __builtin_ctz(n);
#endif
        }
    }  // namespace internal
    
}  // namespace atcoder

#include <cassert>
#include <numeric>
#include <type_traits>

namespace atcoder {
    
    namespace internal {
        
#ifndef _MSC_VER
        template <class T>
        using is_signed_int128 =
        typename std::conditional<std::is_same<T, __int128_t>::value ||
        std::is_same<T, __int128>::value,
        std::true_type,
        std::false_type>::type;
        
        template <class T>
        using is_unsigned_int128 =
        typename std::conditional<std::is_same<T, __uint128_t>::value ||
        std::is_same<T, unsigned __int128>::value,
        std::true_type,
        std::false_type>::type;
        
        template <class T>
        using make_unsigned_int128 =
        typename std::conditional<std::is_same<T, __int128_t>::value,
        __uint128_t,
        unsigned __int128>;
        
        template <class T>
        using is_integral = typename std::conditional<std::is_integral<T>::value ||
        is_signed_int128<T>::value ||
        is_unsigned_int128<T>::value,
        std::true_type,
        std::false_type>::type;
        
        template <class T>
        using is_signed_int = typename std::conditional<(is_integral<T>::value &&
                                                         std::is_signed<T>::value) ||
        is_signed_int128<T>::value,
        std::true_type,
        std::false_type>::type;
        
        template <class T>
        using is_unsigned_int =
        typename std::conditional<(is_integral<T>::value &&
                                   std::is_unsigned<T>::value) ||
        is_unsigned_int128<T>::value,
        std::true_type,
        std::false_type>::type;
        
        template <class T>
        using to_unsigned = typename std::conditional<
        is_signed_int128<T>::value,
        make_unsigned_int128<T>,
        typename std::conditional<std::is_signed<T>::value,
        std::make_unsigned<T>,
        std::common_type<T>>::type>::type;
        
#else
        
        template <class T> using is_integral = typename std::is_integral<T>;
        
        template <class T>
        using is_signed_int =
        typename std::conditional<is_integral<T>::value && std::is_signed<T>::value,
        std::true_type,
        std::false_type>::type;
        
        template <class T>
        using is_unsigned_int =
        typename std::conditional<is_integral<T>::value &&
        std::is_unsigned<T>::value,
        std::true_type,
        std::false_type>::type;
        
        template <class T>
        using to_unsigned = typename std::conditional<is_signed_int<T>::value,
        std::make_unsigned<T>,
        std::common_type<T>>::type;
        
#endif
        
        template <class T>
        using is_signed_int_t = std::enable_if_t<is_signed_int<T>::value>;
        
        template <class T>
        using is_unsigned_int_t = std::enable_if_t<is_unsigned_int<T>::value>;
        
        template <class T> using to_unsigned_t = typename to_unsigned<T>::type;
        
    }  // namespace internal
    
}  // namespace atcoder

#include <cassert>
#include <vector>

namespace atcoder {
    
    template <class T> struct fenwick_tree {
        using U = internal::to_unsigned_t<T>;
        
    public:
        fenwick_tree() : _n(0) {}
        fenwick_tree(int n) : _n(n), data(n) {}
        
        void add(int p, T x) {
            assert(0 <= p && p < _n);
            p++;
            while (p <= _n) {
                data[p - 1] += U(x);
                p += p & -p;
            }
        }
        
        T sum(int l, int r) {
            assert(0 <= l && l <= r && r <= _n);
            return sum(r) - sum(l);
        }
        
    private:
        int _n;
        std::vector<U> data;
        
        U sum(int r) {
            U s = 0;
            while (r > 0) {
                s += data[r - 1];
                r -= r & -r;
            }
            return s;
        }
    };
    
}  // namespace atcoder


#include <algorithm>
#include <cassert>
#include <iostream>
#include <vector>
namespace atcoder {
    
    template <class S,
    S (*op)(S, S),
    S (*e)(),
    class F,
    S (*mapping)(F, S),
    F (*composition)(F, F),
    F (*id)()>
    struct lazy_segtree {
    public:
        lazy_segtree() : lazy_segtree(0) {}
        lazy_segtree(int n) : lazy_segtree(std::vector<S>(n, e())) {}
        lazy_segtree(const std::vector<S>& v) : _n(int(v.size())) {
            log = internal::ceil_pow2(_n);
            size = 1 << log;
            d = std::vector<S>(2 * size, e());
            lz = std::vector<F>(size, id());
            for (int i = 0; i < _n; i++) d[size + i] = v[i];
            for (int i = size - 1; i >= 1; i--) {
                update(i);
            }
        }
        
        void set(int p, S x) {
            assert(0 <= p && p < _n);
            p += size;
            for (int i = log; i >= 1; i--) push(p >> i);
            d[p] = x;
            for (int i = 1; i <= log; i++) update(p >> i);
        }
        
        S get(int p) {
            assert(0 <= p && p < _n);
            p += size;
            for (int i = log; i >= 1; i--) push(p >> i);
            return d[p];
        }
        
        S prod(int l, int r) {
            assert(0 <= l && l <= r && r <= _n);
            if (l == r) return e();
            
            l += size;
            r += size;
            
            for (int i = log; i >= 1; i--) {
                if (((l >> i) << i) != l) push(l >> i);
                if (((r >> i) << i) != r) push(r >> i);
            }
            
            S sml = e(), smr = e();
            while (l < r) {
                if (l & 1) sml = op(sml, d[l++]);
                if (r & 1) smr = op(d[--r], smr);
                l >>= 1;
                r >>= 1;
            }
            
            return op(sml, smr);
        }
        
        S all_prod() { return d[1]; }
        
        void apply(int p, F f) {
            assert(0 <= p && p < _n);
            p += size;
            for (int i = log; i >= 1; i--) push(p >> i);
            d[p] = mapping(f, d[p]);
            for (int i = 1; i <= log; i++) update(p >> i);
        }
        void apply(int l, int r, F f) {
            assert(0 <= l && l <= r && r <= _n);
            if (l == r) return;
            
            l += size;
            r += size;
            
            for (int i = log; i >= 1; i--) {
                if (((l >> i) << i) != l) push(l >> i);
                if (((r >> i) << i) != r) push((r - 1) >> i);
            }
            
            {
                int l2 = l, r2 = r;
                while (l < r) {
                    if (l & 1) all_apply(l++, f);
                    if (r & 1) all_apply(--r, f);
                    l >>= 1;
                    r >>= 1;
                }
                l = l2;
                r = r2;
            }
            
            for (int i = 1; i <= log; i++) {
                if (((l >> i) << i) != l) update(l >> i);
                if (((r >> i) << i) != r) update((r - 1) >> i);
            }
        }
        
        template <bool (*g)(S)> int max_right(int l) {
            return max_right(l, [](S x) { return g(x); });
        }
        template <class G> int max_right(int l, G g) {
            assert(0 <= l && l <= _n);
            assert(g(e()));
            if (l == _n) return _n;
            l += size;
            for (int i = log; i >= 1; i--) push(l >> i);
            S sm = e();
            do {
                while (l % 2 == 0) l >>= 1;
                if (!g(op(sm, d[l]))) {
                    while (l < size) {
                        push(l);
                        l = (2 * l);
                        if (g(op(sm, d[l]))) {
                            sm = op(sm, d[l]);
                            l++;
                        }
                    }
                    return l - size;
                }
                sm = op(sm, d[l]);
                l++;
            } while ((l & -l) != l);
            return _n;
        }
        
        template <bool (*g)(S)> int min_left(int r) {
            return min_left(r, [](S x) { return g(x); });
        }
        template <class G> int min_left(int r, G g) {
            assert(0 <= r && r <= _n);
            assert(g(e()));
            if (r == 0) return 0;
            r += size;
            for (int i = log; i >= 1; i--) push((r - 1) >> i);
            S sm = e();
            do {
                r--;
                while (r > 1 && (r % 2)) r >>= 1;
                if (!g(op(d[r], sm))) {
                    while (r < size) {
                        push(r);
                        r = (2 * r + 1);
                        if (g(op(d[r], sm))) {
                            sm = op(d[r], sm);
                            r--;
                        }
                    }
                    return r + 1 - size;
                }
                sm = op(d[r], sm);
            } while ((r & -r) != r);
            return 0;
        }
        
    private:
        int _n, size, log;
        std::vector<S> d;
        std::vector<F> lz;
        
        void update(int k) { d[k] = op(d[2 * k], d[2 * k + 1]); }
        void all_apply(int k, F f) {
            d[k] = mapping(f, d[k]);
            if (k < size) lz[k] = composition(f, lz[k]);
        }
        void push(int k) {
            all_apply(2 * k, lz[k]);
            all_apply(2 * k + 1, lz[k]);
            lz[k] = id();
        }
    };
    
}  // namespace atcoder

#include <algorithm>
#include <cassert>
#include <vector>

namespace atcoder {
    
    template <class S, S (*op)(S, S), S (*e)()> struct segtree {
    public:
        segtree() : segtree(0) {}
        segtree(int n) : segtree(std::vector<S>(n, e())) {}
        segtree(const std::vector<S>& v) : _n(int(v.size())) {
            log = internal::ceil_pow2(_n);
            size = 1 << log;
            d = std::vector<S>(2 * size, e());
            for (int i = 0; i < _n; i++) d[size + i] = v[i];
            for (int i = size - 1; i >= 1; i--) {
                update(i);
            }
        }
        
        void set(int p, S x) {
            assert(0 <= p && p < _n);
            p += size;
            d[p] = x;
            for (int i = 1; i <= log; i++) update(p >> i);
        }
        
        S get(int p) {
            assert(0 <= p && p < _n);
            return d[p + size];
        }
        
        S prod(int l, int r) {
            assert(0 <= l && l <= r && r <= _n);
            S sml = e(), smr = e();
            l += size;
            r += size;
            
            while (l < r) {
                if (l & 1) sml = op(sml, d[l++]);
                if (r & 1) smr = op(d[--r], smr);
                l >>= 1;
                r >>= 1;
            }
            return op(sml, smr);
        }
        
        S all_prod() { return d[1]; }
        
        template <bool (*f)(S)> int max_right(int l) {
            return max_right(l, [](S x) { return f(x); });
        }
        template <class F> int max_right(int l, F f) {
            assert(0 <= l && l <= _n);
            assert(f(e()));
            if (l == _n) return _n;
            l += size;
            S sm = e();
            do {
                while (l % 2 == 0) l >>= 1;
                if (!f(op(sm, d[l]))) {
                    while (l < size) {
                        l = (2 * l);
                        if (f(op(sm, d[l]))) {
                            sm = op(sm, d[l]);
                            l++;
                        }
                    }
                    return l - size;
                }
                sm = op(sm, d[l]);
                l++;
            } while ((l & -l) != l);
            return _n;
        }
        
        template <bool (*f)(S)> int min_left(int r) {
            return min_left(r, [](S x) { return f(x); });
        }
        template <class F> int min_left(int r, F f) {
            assert(0 <= r && r <= _n);
            assert(f(e()));
            if (r == 0) return 0;
            r += size;
            S sm = e();
            do {
                r--;
                while (r > 1 && (r % 2)) r >>= 1;
                if (!f(op(d[r], sm))) {
                    while (r < size) {
                        r = (2 * r + 1);
                        if (f(op(d[r], sm))) {
                            sm = op(d[r], sm);
                            r--;
                        }
                    }
                    return r + 1 - size;
                }
                sm = op(d[r], sm);
            } while ((r & -r) != r);
            return 0;
        }
        
    private:
        int _n, size, log;
        std::vector<S> d;
        
        void update(int k) { d[k] = op(d[2 * k], d[2 * k + 1]); }
    };
    
}  // namespace atcoder


int main(){
    
    std::ifstream in("text.txt");
    std::cin.rdbuf(in.rdbuf());
    cin.tie(0);
    ios::sync_with_stdio(false);
    
    ll N,Q;cin>>N>>Q;
    vector<ll> A(N),use;
    for(int i=0;i<N;i++) cin>>A[i];
    use=A;
    vector<vector<ll>> que(Q);
    for(int q=0;q<Q;q++){
        int t;cin>>t;
        if(t==1){
            ll k,x;cin>>k>>x;k--;
            que[q]={t,k,x};
            use.push_back(x);
        }
        if(t==2){
            que[q]={t};
        }
        if(t==3){
            ll x;cin>>x;x--;
            que[q]={t,x};
        }
    }
    sort(all(use));
    use.erase(unique(all(use)),use.end());
    
    ll M=si(use);
    atcoder::fenwick_tree<ll> BI(M),ali(N);
    
    vector<ll> X,Y,Z(N),zz;
    
    bool upd=false;
    for(auto S:que){
        if(S[0]==1){
            ll k=S[1],x=S[2];
            if(!upd){
                A[k]=x;
            }else{
                int l=0,r=M;
                ll cn=ali.sum(0,k);
                while(r-l>1){
                    int m=(l+r)/2;
                    if(BI.sum(0,m)>cn) r=m;
                    else l=m;
                }
                if(Z[k]){
                    X.push_back(lower_bound(all(use),A[k])-use.begin());
                    Y.push_back(lower_bound(all(use),x)-use.begin());
                    A[k]=x;
                }else{
                    BI.add(l,-1);
                    Y.push_back(lower_bound(all(use),x)-use.begin());
                    Z[k]=true;
                    zz.push_back(k);
                    A[k]=x;
                    ali.add(k,-1);
                }
            }
        }
        if(S[0]==2){
            if(!upd){
                sort(all(A));
                upd=true;
                for(ll x:A){
                    BI.add(lower_bound(all(use),x)-use.begin(),1);
                }
                for(int i=0;i<N;i++) ali.add(i,1);
            }else{
                for(ll a:X) BI.add(a,-1);
                for(ll a:Y) BI.add(a,1);
                for(ll a:zz){
                    ali.add(a,1);
                    Z[a]=false;
                }
                X.clear();
                Y.clear();
                zz.clear();
            }
        }
        if(S[0]==3){
            ll k=S[1];
            if(!upd) cout<<A[k]<<"\n";
            else{
                if(Z[k]) cout<<A[k]<<"\n";
                else{
                    ll cn=ali.sum(0,k);
                    int l=0,r=M;
                    while(r-l>1){
                        int m=(l+r)/2;
                        if(BI.sum(0,m)>cn) r=m;
                        else l=m;
                    }
                    cout<<use[l]<<"\n";
                }
            }
        }
    }
}

0