結果

問題 No.8121 [Deleted]
ユーザー harurun
提出日時 2025-04-01 23:28:30
言語 C++17
(gcc 13.3.0 + boost 1.87.0)
結果
WA  
実行時間 -
コード長 2,140 bytes
コンパイル時間 930 ms
コンパイル使用メモリ 76,840 KB
実行使用メモリ 9,080 KB
最終ジャッジ日時 2025-04-01 23:28:34
合計ジャッジ時間 3,541 ms
ジャッジサーバーID
(参考情報)
judge5 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 1
other WA * 10
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

// ごめんなさい、コンテスト終了後に聞いた(chat gpt)

int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n, q;
    cin >> n >> q;
    vector<long long> a(n);
    for (int i = 0; i < n; i++){
        cin >> a[i];
    }

    // セグメントツリー構築(反復型)
    int size = 1;
    while(size < n) size *= 2;
    // 十分小さい値(負の無限大)で初期化
    const long long NEG_INF = -1e18;
    vector<long long> seg(2 * size, NEG_INF);
    // 葉の初期化
    for (int i = 0; i < n; i++){
        seg[size + i] = a[i];
    }
    for (int i = n; i < size; i++){
        seg[size + i] = NEG_INF;
    }
    // 内部ノードの構築
    for (int i = size - 1; i >= 1; i--){
        seg[i] = max(seg[2 * i], seg[2 * i + 1]);
    }

    // 点更新:インデックス pos (0-indexed) の値に val を加算する
    auto update = [&](int pos, long long val) {
        pos += size;
        seg[pos] += val;
        for (pos /= 2; pos >= 1; pos /= 2){
            seg[pos] = max(seg[2 * pos], seg[2 * pos + 1]);
        }
    };

    // 区間 [l, r] の最大値を返す (l, r は0-indexed、両端含む)
    auto query = [&](int l, int r) -> long long {
        long long res = NEG_INF;
        l += size;
        r += size;
        while(l <= r){
            if(l % 2 == 1){
                res = max(res, seg[l]);
                l++;
            }
            if(r % 2 == 0){
                res = max(res, seg[r]);
                r--;
            }
            l /= 2;
            r /= 2;
        }
        return res;
    };

    // クエリ処理
    for (int i = 0; i < q; i++){
        int t;
        cin >> t;
        if(t == 1){
            int x;
            long long y;
            cin >> x >> y;
            update(x - 1, y);  // 入力は1-indexedなので変換
        }
        else if(t == 2){
            int l, r;
            cin >> l >> r;
            cout << query(l - 1, r - 1) << "\n";  // 1-indexedから0-indexedへ
        }
    }

    return 0;
}
0