結果

問題 No.255 Splarrraaay スプラーレェーーイ
コンテスト
ユーザー zelda_master
提出日時 2026-10-21 01:12:42
言語 C++14
(gcc 15.3.0 + boost 1.92.0 + ACL)
コンパイル:
g++-15 -O2 -lm -std=c++14 -Wuninitialized -DONLINE_JUDGE -o a.out _filename_
実行:
./a.out
結果
MLE  
実行時間 -
コード長 3,362 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 412 ms
コンパイル使用メモリ 78,300 KB
実行使用メモリ 1,300,096 KB
最終ジャッジ日時 2026-10-21 01:12:56
合計ジャッジ時間 6,890 ms
ジャッジサーバーID
(参考情報)
judge4_0 / judge1_0
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other MLE * 2 -- * 8
権限があれば一括ダウンロードができます
コンパイルメッセージ
main.cpp: In function 'int main()':
main.cpp:98:34: warning: 'ma_idx' may be used uninitialized [-Wmaybe-uninitialized]
   98 |             if (ma > 0 && ma_idx != -1) {
      |                           ~~~~~~~^~~~~
main.cpp:89:25: note: 'ma_idx' was declared here
   89 |             int ma = 0, ma_idx;
      |                         ^~~~~~

ソースコード

diff #
raw source code

#include <iostream>
#include <cstdio>

using namespace std;

typedef long long LL;

const LL V = 1e13;
const int N = 150010;

int q;
LL n, ans[6];

struct Node {
	int l, r, lz;
    LL sum[6];
};

struct SegTree {
    Node seg[N * 25];
    int rt, idx;
    void PushUp(int u) {
        for (int i = 1; i <= 5; ++i) {
            seg[u].sum[i] = seg[seg[u].l].sum[i] + seg[seg[u].r].sum[i];
        }
    }
    void PushDown(int u, LL ul, LL ur) {
        if (seg[u].lz) {
            if (!seg[u].l) seg[u].l = ++idx;
            if (!seg[u].r) seg[u].r = ++idx;
            int mid = ul + ur >> 1;
            seg[seg[u].l].lz = seg[seg[u].r].lz = seg[u].lz;
            for (int i = 1; i <= 5; ++i) {
                if (seg[u].lz == i) {
                    seg[seg[u].l].sum[i] = mid - ul + 1;
                    seg[seg[u].r].sum[i] = ur - mid;
                } else {
                    seg[seg[u].l].sum[i] = 0;
                    seg[seg[u].r].sum[i] = 0;
                }
            }
            seg[u].lz = 0;
        }
    }
    void Modify(int &u, LL ul, LL ur, int l, int r, int id) {
        if (!u) u = ++idx;
        if (l <= ul && ur <= r) {
            seg[u].lz = id;
            for (int i = 1; i <= 5; ++i) {
                if (i == id) seg[u].sum[i] += ur - ul + 1;
                else seg[u].sum[i] = 0;
            }
            return;
        }
        PushDown(u, ul, ur);
        LL mid = ul + ur >> 1;
        if (mid >= l) Modify(seg[u].l, ul, mid, l, r, id);
        if (mid + 1 <= r) Modify(seg[u].r, mid + 1, ur, l, r, id);
        PushUp(u);
    }
    Node Query(int u, LL ul, LL ur, int l, int r) {
        if (l <= ul && ur <= r) return seg[u];
        PushDown(u, ul, ur);
        Node ret = { 0, 0, 0 };
        LL mid = ul + ur >> 1;
        if (mid >= l) {
            Node res = Query(seg[u].l, ul, mid, l, r);
            for (int i = 1; i <= 5; ++i) ret.sum[i] += res.sum[i];
        }
        if (mid + 1 <= r) {
            Node res = Query(seg[u].r, mid + 1, ur, l, r);
            for (int i = 1; i <= 5; ++i) ret.sum[i] += res.sum[i];
        }
        return ret;
    }
};
SegTree sgt;

int main() {
    // freopen("color.in", "r", stdin);
    // freopen("color.out", "w", stdout);

    scanf("%lld%d", &n, &q);
    while (q--) {
        int op, l, r;
        scanf("%d%d%d", &op, &l, &r);
        if (op == 0) {
            Node res = sgt.Query(sgt.rt, 0, V, l, r); // 最大值,多少个最大值
            int ma = 0, ma_idx;
            for (int i = 1; i <= 5; ++i) {
                if (ma < res.sum[i]) {
                    ma = res.sum[i];
                    ma_idx = i;
                } else if (ma == res.sum[i]) {
                    ma_idx = -1;
                }
            }
            if (ma > 0 && ma_idx != -1) {
                ans[ma_idx] += ma;   
            }
        } else if (op == 1) {
            sgt.Modify(sgt.rt, 0, V, l, r, 1);
        } else if (op == 2) {
            sgt.Modify(sgt.rt, 0, V, l, r, 2);
        } else if (op == 3) {
            sgt.Modify(sgt.rt, 0, V, l, r, 3);
        } else if (op == 4) {
            sgt.Modify(sgt.rt, 0, V, l, r, 4);
        } else {
            sgt.Modify(sgt.rt, 0, V, l, r, 5);
        }
    }

    for (int i = 1; i <= 5; ++i) {
        printf("%lld%c", ans[i] + sgt.seg[1].sum[i], " \n"[i == 5]);
    }

    return 0;
}
0