結果

問題 No.789 範囲の合計
ユーザー leaf_1415leaf_1415
提出日時 2019-02-16 03:07:50
言語 C++11
(gcc 11.4.0)
結果
AC  
実行時間 393 ms / 1,000 ms
コード長 1,631 bytes
コンパイル時間 618 ms
コンパイル使用メモリ 62,224 KB
実行使用メモリ 101,708 KB
最終ジャッジ日時 2024-09-19 00:07:28
合計ジャッジ時間 5,309 ms
ジャッジサーバーID
(参考情報)
judge2 / judge5
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
5,248 KB
testcase_01 AC 2 ms
5,376 KB
testcase_02 AC 331 ms
101,496 KB
testcase_03 AC 103 ms
5,376 KB
testcase_04 AC 344 ms
101,588 KB
testcase_05 AC 322 ms
101,588 KB
testcase_06 AC 333 ms
101,588 KB
testcase_07 AC 97 ms
5,376 KB
testcase_08 AC 241 ms
52,560 KB
testcase_09 AC 228 ms
52,436 KB
testcase_10 AC 393 ms
101,584 KB
testcase_11 AC 341 ms
101,584 KB
testcase_12 AC 343 ms
101,708 KB
testcase_13 AC 1 ms
5,376 KB
testcase_14 AC 2 ms
5,376 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <iostream>
#include <vector>
#define llint long long

using namespace std;

struct SegNode{
	llint val;
	int 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;
}
0