結果

問題 No.789 範囲の合計
ユーザー leaf_1415leaf_1415
提出日時 2019-02-16 03:03:08
言語 C++11
(gcc 11.4.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
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
5,248 KB
testcase_01 AC 1 ms
5,376 KB
testcase_02 MLE -
testcase_03 AC 103 ms
5,376 KB
testcase_04 MLE -
testcase_05 MLE -
testcase_06 MLE -
testcase_07 AC 97 ms
5,376 KB
testcase_08 AC 215 ms
68,812 KB
testcase_09 AC 208 ms
68,944 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 <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;
}
0