Submission
Status:
[PPPPxSSSSSSSSSSSSSSS]
Subtask/Task Score:
{0/100}
Score: 0
User: Dormon
Problemset: ฮีโร่และมอนสเตอร์
Language: cpp
Time: 0.585 second
Submitted On: 2025-12-08 12:24:09
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
using ll = long long;
struct sparse_segment_tree {
struct Node {
ll val = 0;
Node *l, *r;
Node() : val(0), l(nullptr), r(nullptr) {}
};
int n;
Node *root = new Node();
sparse_segment_tree(int n) : n(n) {}
void push(Node *curr){
if (curr->l == nullptr) curr->l = new Node();
if (curr->r == nullptr) curr->r = new Node();
}
void pull(Node *curr){
curr->val = curr->l->val + curr->r->val;
}
void update(Node *curr, int l, int r, int idx, ll val){
push(curr);
if (l == r){
curr->val += val;
return ;
}
int mid = (l + r) / 2;
if (idx <= mid) update(curr->l, l, mid, idx, val);
else update(curr->r, mid + 1, r, idx, val);
pull(curr);
}
ll query(Node *curr, int l, int r, int lb, int ub){
push(curr);
if (lb <= l && r <= ub) return curr->val;
if (r < lb || l > ub) return 0;
int mid = (l + r) / 2;
return query(curr->l, l, mid, lb, ub) + query(curr->r, mid + 1, r, lb, ub);
}
void update(ll idx, ll val){
update(root, 1, n, idx, val);
}
ll query(ll l, ll r){
return query(root, 1, n, l, r);
}
void print(Node *curr, int l, int r){
if (curr == nullptr) return ;
cout << l << ' ' << r << " : " << curr->val << ' ' << '\n';
int mid = (l + r) / 2;
print(curr->l, l, mid); print(curr->r, mid + 1, r);
}
void print(){
print(root, 1, n);
cout << '\n';
}
};
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
int n, m;
cin >> n >> m;
vector<ll> v(n);
sparse_segment_tree seg(1e9 + 2);
for (auto &e:v) cin >> e;
for (int i = 1;i <= m;i++){
ll a, b;
cin >> a >> b;
seg.update(a, b);
}
for (auto e:v) cout << seg.query(1, e) << '\n';
}