結果
| 問題 |
No.789 範囲の合計
|
| コンテスト | |
| ユーザー |
champignon
|
| 提出日時 | 2025-10-12 17:43:13 |
| 言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 160 ms / 1,000 ms |
| コード長 | 2,790 bytes |
| コンパイル時間 | 3,308 ms |
| コンパイル使用メモリ | 282,280 KB |
| 実行使用メモリ | 34,560 KB |
| 最終ジャッジ日時 | 2025-10-12 17:43:20 |
| 合計ジャッジ時間 | 6,387 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 15 |
ソースコード
#include<bits/stdc++.h>
using namespace std;
#define rep(i, l, n) for(int i = int(l); i < int(n); i++)
#define ll long long
#define all(x) (x).begin(), (x).end()
#define rall(x) (x).rbegin(), (x).rend()
template<class T> bool chmin(T &a, T b) {if(a > b) {a = b; return true;} return false;}
template<class T> bool chmax(T &a, T b) {if(a < b) {a = b; return true;} return false;}
template<class T> using spq = priority_queue<T, vector<T>, greater<T>>;
// bool -> Yes/No
string answer(bool b) {return b ? "Yes" : "No";}
void fix(int k) {cout << fixed << setprecision(k);}
const int inf = 2e9;
const long long INF = 2e18;
const long double eps = 1e-12;
const long double pi = acos(-1);
int dx[] = {0, -1, 0, 1, -1, -1, 1, 1}, dy[] = {1, 0, -1, 0, 1, -1, -1, 1};
template<class T>
struct Dynamic_Segment_Tree {
public:
Dynamic_Segment_Tree(int N) : n(N) {}
void set(int pos, T v) {set(root, pos, v, 0, n);}
T get(int pos) {return get(root, pos, 0, n);}
T prod(int l, int r) {return prod(root, l, r, 0, n);}
private:
int n;
struct node {
T val;
node *lch, *rch;
node() : val(0), lch(nullptr), rch(nullptr) {}
node(T v) : val(v), lch(nullptr), rch(nullptr) {}
};
node *root = nullptr;
void set(node *&x, int pos, T v, int l, int r) {
if(x == nullptr) x = new node(0);
if(r - l == 1) {
x->val = v;
return;
}
int m = (l + r) >> 1;
if(pos < m) set(x->lch, pos, v, l, m);
else set(x->rch, pos, v, m, r);
x->val = 0;
if(x->lch != nullptr) x->val += x->lch->val;
if(x->rch != nullptr) x->val += x->rch->val;
}
T get(node *&x, int pos, int l, int r) {
if(x == nullptr) return 0;
if(r - l == 1) return x->val;
int m = (l + r) >> 1;
if(pos < m) return get(x->lch, pos, l, m);
else return get(x->rch, pos, m, r);
}
T prod(node *&x, int ql, int qr, int l, int r) {
if(x == nullptr || qr <= l || r <= ql) return 0;
if(ql <= l && r <= qr) return x->val;
int m = (l + r) >> 1;
return prod(x->lch, ql, qr, l, m) + prod(x->rch, ql, qr, m, r);
}
};
void main_program() {
int q; cin >> q;
Dynamic_Segment_Tree<long> seg(1e9 + 3);
long ans = 0;
while(q--) {
int t; cin >> t;
if(t) {
int l, r; cin >> l >> r;
ans += seg.prod(l, ++r);
}
else {
int pos; long v; cin >> pos >> v;
seg.set(pos, seg.get(pos) + v);
//cout << seg.get(pos) << "\n";
}
}
cout << ans << "\n";
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int T = 1;
//cin >> T;
while(T--) {
main_program();
}
}
champignon