結果

問題 No.789 範囲の合計
ユーザー KPCCoiLKPCCoiL
提出日時 2019-02-17 13:14:48
言語 C++17
(gcc 12.3.0 + boost 1.83.0)
結果
MLE  
実行時間 -
コード長 2,345 bytes
コンパイル時間 1,177 ms
コンパイル使用メモリ 95,092 KB
実行使用メモリ 173,952 KB
最終ジャッジ日時 2024-09-25 06:30:52
合計ジャッジ時間 5,931 ms
ジャッジサーバーID
(参考情報)
judge4 / judge2
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
5,248 KB
testcase_01 AC 2 ms
5,376 KB
testcase_02 MLE -
testcase_03 AC 54 ms
5,376 KB
testcase_04 MLE -
testcase_05 MLE -
testcase_06 MLE -
testcase_07 AC 48 ms
5,376 KB
testcase_08 AC 225 ms
50,560 KB
testcase_09 AC 201 ms
46,208 KB
testcase_10 MLE -
testcase_11 MLE -
testcase_12 MLE -
testcase_13 AC 2 ms
5,376 KB
testcase_14 AC 2 ms
5,376 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <iostream>
#include <memory>
#define NDEBUG
#include <cassert>

template <class Monoid>
class segtree_node {
  public:
    using value_type = typename Monoid::value_type;
  private:
    using node_t = std::unique_ptr<segtree_node<Monoid>>;
    node_t lch, rch;
    int n;
    value_type value;

    void require_lch() {
      if (!lch) {
        lch = std::make_unique<segtree_node>(n / 2);
      }
    }
    void require_rch() {
      if (!rch) {
        rch = std::make_unique<segtree_node>(n - n / 2);
      }
    }

  public:
    segtree_node(int n):
      n(n),
      value(Monoid::zero)
    {}

    value_type get(int i) {
      assert(0 <= i && i < n);
      if (n == 1) {
        return value;
      }
      else if (i < n / 2) {
        if (!lch) return Monoid::zero;
        return lch->get(i);
      }
      else {
        if (!rch) return Monoid::zero;
        return rch->get(i - n / 2);
      }
    }

    void update(int i, value_type x) {
      assert(0 <= i && i < n);
      if (n == 1) {
        value = x;
      }
      else {
        if (i < n / 2) {
          require_lch();
          lch->update(i, x);
        }
        else {
          require_rch();
          rch->update(i - n / 2, x);
        }
        auto lv = lch ? lch->value : Monoid::zero,
             rv = rch ? rch->value : Monoid::zero;
        value = Monoid::product(lv, rv);
      }
    }

    value_type product(int from, int to) {
      if (to <= 0 || n <= from)
        return Monoid::zero;
      if (from <= 0 && n <= to)
        return value;
      require_lch();
      require_rch();
      auto lp = lch->product(from, to),
           rp = rch->product(from - n / 2, to - n / 2);
      return Monoid::product(lp, rp);
    }
};

struct ll_sum {
  using value_type = long long;
  static constexpr value_type zero = 0;
  static long long product(value_type x, value_type y) {
    return x + y;
  }
};

int main() {
  std::ios_base::sync_with_stdio(false);
  std::cin.tie(nullptr);
  int n;
  std::cin >> n;
  int t, x, y;
  segtree_node<ll_sum> segtree(1000000001);
  long long sum = 0;
  for (int i = 0; i < n; i++) {
    std::cin >> t >> x >> y;
    if (t == 0) {
      auto current = segtree.get(x);
      segtree.update(x, current + y);
    }
    else {
      sum += segtree.product(x, y + 1);
    }
  }
  std::cout << sum << std::endl;
}
0