結果
| 問題 |
No.789 範囲の合計
|
| コンテスト | |
| ユーザー |
leaf_1415
|
| 提出日時 | 2019-02-16 03:03:08 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
MLE
|
| 実行時間 | - |
| コード長 | 1,633 bytes |
| コンパイル時間 | 690 ms |
| コンパイル使用メモリ | 62,592 KB |
| 実行使用メモリ | 136,188 KB |
| 最終ジャッジ日時 | 2024-09-19 00:00:46 |
| 合計ジャッジ時間 | 6,066 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 8 MLE * 7 |
ソースコード
#include <iostream>
#include <vector>
#define llint long long
using namespace std;
struct SegNode{
llint val;
llint left, right, parent;
SegNode(llint p, llint x = 0){ //initial value
left = right = -1;
parent = p;
val = x;
}
};
struct SegTree{
llint size;
vector<SegNode> seg;
SegTree(llint size){
this->size = size;
init();
}
void init()
{
seg.clear();
seg.push_back(SegNode(-1));
}
void check(llint p){
if(seg[p].left == -1){
seg.push_back(SegNode(p));
seg[p].left = (llint)seg.size()-1;
}
if(seg[p].right == -1){
seg.push_back(SegNode(p));
seg[p].right = (llint)seg.size()-1;
}
}
void update(llint i, llint val)
{
llint p = 0, l = 0, r = (1<<size)-1;
while(l < r){
check(p);
if(i <= (l+r)/2) p = seg[p].left, r = (l+r)/2;
else p = seg[p].right, l = (l+r)/2+1;
}
seg[p].val = val;
p = seg[p].parent;
while(p != -1){
seg[p].val = seg[seg[p].left].val + seg[seg[p].right].val;
p = seg[p].parent;
}
}
llint query(llint a, llint b, llint p, llint l, llint r)
{
if(b < l || r < a) return 0;
if(a <= l && r <= b) return seg[p].val;
check(p);
llint lval = query(a, b, seg[p].left, l, (l+r)/2);
llint rval = query(a, b, seg[p].right, (l+r)/2+1, r);
return lval + rval;
}
llint query(llint a, llint b)
{
return query(a, b, 0, 0, (1<<size)-1);
}
};
llint n;
SegTree seg(30);
int main(void)
{
cin >> n;
llint t, a, b, ans = 0;
for(llint i = 0; i < n; i++){
cin >> t >> a >> b;
if(t == 0){
seg.update(a, seg.query(a, a)+b);
}
if(t == 1){
ans += seg.query(a, b);
}
}
cout << ans << endl;
return 0;
}
leaf_1415