結果

問題 No.789 範囲の合計
ユーザー 259_Momone259_Momone
提出日時 2019-11-03 17:56:28
言語 C++11
(gcc 11.4.0)
結果
TLE  
実行時間 -
コード長 1,626 bytes
コンパイル時間 1,239 ms
コンパイル使用メモリ 154,372 KB
実行使用メモリ 12,048 KB
最終ジャッジ日時 2023-10-13 01:49:19
合計ジャッジ時間 5,906 ms
ジャッジサーバーID
(参考情報)
judge13 / judge14
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 TLE -
testcase_01 -- -
testcase_02 -- -
testcase_03 -- -
testcase_04 -- -
testcase_05 -- -
testcase_06 -- -
testcase_07 -- -
testcase_08 -- -
testcase_09 -- -
testcase_10 -- -
testcase_11 -- -
testcase_12 -- -
testcase_13 -- -
testcase_14 -- -
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <bits/stdc++.h>

int main(){
    using namespace std;

    unordered_map<unsigned long, unsigned long> segtree;
    unsigned long max_n{1};

    const auto& set = [&segtree, &max_n](unsigned long i, unsigned long a) -> void {
        (i *= 2) += 1;
        segtree[i] += a;
        unsigned long k{1};
        while(__builtin_popcount(i) != 1 || i <= max_n){
            auto j = (i ^ k) | (k << 1);
            k <<= 1;
            if(segtree.count(j)){
                segtree[j] += a;
            }else{
                segtree[j] = segtree[i];
                if(segtree.count(i ^ k))segtree[j] += segtree[i ^ k];
            }
            i = j;
        }
        i >>= 1;
        while((max_n <<= 1) < i)segtree[max_n] = segtree[max_n >> 1];
        segtree[max_n] = segtree[max_n >> 1] + segtree[(max_n >> 1) * 3];
    };
    const auto& fold = [&segtree, &max_n](unsigned long l, unsigned long r) -> unsigned long {
        (l *= 2) += 1;
        (r *= 2) += 1;
        unsigned long k{2}, ret{0};
        while(l != r){
            if(l & k){
                if(segtree.count(l))ret += segtree[l];
                l += k;
            }
            if(r & k){
                r -= k;
                if(segtree.count(r))ret += segtree[r];
            }
            l += k >> 1;
            r += k >> 1;
            k <<= 1;
        }
        return ret;
    };

    unsigned long n;
    cin >> n;
    unsigned long ans{0};
    for(unsigned long _ = 0, c, x, y; _ < n; ++_){
        cin >> c >> x >> y;
        if(c)ans += fold(x, y + 1);
        else set(x, y);
    }
    cout << ans << endl;

    return 0;
}
0