結果

問題 No.868 ハイパー部分和問題
コンテスト
ユーザー vjudge1
提出日時 2026-06-19 11:20:17
言語 C++14
(gcc 15.2.0 + boost 1.89.0)
コンパイル:
g++-15 -O2 -lm -std=c++14 -Wuninitialized -DONLINE_JUDGE -o a.out _filename_
実行:
./a.out
結果
WA  
実行時間 -
コード長 1,106 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 1,635 ms
コンパイル使用メモリ 182,740 KB
実行使用メモリ 64,128 KB
最終ジャッジ日時 2026-06-19 11:20:26
合計ジャッジ時間 6,810 ms
ジャッジサーバーID
(参考情報)
judge1_1 / judge2_0
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 1 WA * 1
other AC * 4 WA * 34
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

#include <bits/stdc++.h>
using namespace std;
const int M = 15005;
int a[M];
struct Node {
    bitset<M> s;
} tree[M * 4];
void build(int l, int r, int p) {
    if (l == r) {
        tree[p].s.reset();
        tree[p].s[0] = 1;
        tree[p].s[a[l]] = 1;
        return;
    }
    int m = (l + r) >> 1;
    build(l, m, p << 1);
    build(m + 1, r, p << 1 | 1);
    tree[p].s = tree[p << 1].s | (tree[p << 1].s << a[m + 1]);
}
void update(int l, int r, int p, int i, int v) {
    if (l == r) {
        a[i] = v;
        tree[p].s.reset();
        tree[p].s[0] = 1;
        tree[p].s[v] = 1;
        return;
    }
    int m = (l + r) >> 1;
    if (i <= m) update(l, m, p << 1, i, v);
    else update(m + 1, r, p << 1 | 1, i, v);
    tree[p].s = tree[p << 1].s | (tree[p << 1].s << a[m + 1]);
}
int main() {
    int n, k, q, x, v;
    scanf("%d%d", &n, &k);
    for (int i = 1; i <= n; i++) {
        scanf("%d", &a[i]);
    }
    build(1, n, 1);
    scanf("%d", &q);
    while (q--) {
        scanf("%d%d", &x, &v);
        update(1, n, 1, x, v);
        cout << tree[1].s[k] << endl;
    }
    return 0;
}
0