結果
| 問題 |
No.789 範囲の合計
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2019-03-02 15:42:08 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 268 ms / 1,000 ms |
| コード長 | 1,466 bytes |
| コンパイル時間 | 1,496 ms |
| コンパイル使用メモリ | 167,948 KB |
| 実行使用メモリ | 16,920 KB |
| 最終ジャッジ日時 | 2024-06-23 12:25:24 |
| 合計ジャッジ時間 | 4,304 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 15 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
long long segTree[1000000] = {};
int segSize;
void init(int n){
segSize = 1;
while(segSize < n) segSize *= 2;
return;
}
void update(int i, long long val){
i = segSize-1+i;
segTree[i] += val;
while(i > 0){
i = (i - 1) / 2;
segTree[i] = segTree[i*2+1] + segTree[i*2+2];
}
return;
}
long long getsum(int a, int b, int k = 0, int l = 0, int r = segSize){
if(r <= a || b <= l) return 0;
if(a <= l && r <= b) return segTree[k];
long long vl = getsum(a,b,2*k+1,l,(l+r)/2);
long long vr = getsum(a,b,2*k+2,(l+r)/2,r);
return vl + vr;
}
int q[100010], x[100010], y[100010];
int main(){
int n;
cin >> n;
set<int> st;
for(int i = 0;i < n;i++){
cin >> q[i] >> x[i] >> y[i];
st.insert(x[i]);
if(q[i] == 1){
st.insert(y[i]);
}
}
vector<int> vec;
for(auto itr = st.begin();itr != st.end();itr++){
vec.push_back(*itr);
}
init(vec.size());
long long ans = 0;
for(int i = 0;i < n;i++){
if(q[i] == 0){
int idx = lower_bound(vec.begin(), vec.end(), x[i]) - vec.begin();
update(idx, y[i]);
}else{
int idx1 = lower_bound(vec.begin(), vec.end(), x[i]) - vec.begin();
int idx2 = lower_bound(vec.begin(), vec.end(), y[i]) - vec.begin();
ans += getsum(idx1, idx2+1);
}
}
cout << ans << endl;
return 0;
}