Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <algorithm>
- #include <iterator>
- #include <cmath>
- #include <vector>
- #include <stack>
- #include <deque>
- #include <queue>
- #include <set>
- #include <map>
- #include <stack>
- #include <string>
- #include <random>
- #include <numeric>
- #include <unordered_set>
- typedef long long ll;
- typedef long double lb;
- #define fast ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
- #define file_in freopen("input.txt", "r", stdin);
- #define fori(st, n) for (ll i = st; i < n; ++i)
- #define forj(st, n) for (ll j = st; j < n; ++j)
- #define fork(st, n) for (ll k = st; k < n; ++k)
- #define fors(st, n) for (ll s = st; s < n; ++s)
- #define forb(n) for (ll i = n - 1; i > 0; --i)
- #define pb push_back
- #define mp make_pair
- #define all(x) (x).begin(),(x).end()
- #define fi first
- #define se second
- using namespace std;
- struct seg_tree {
- vector<int> a;
- vector<ll> sum;
- seg_tree(vector<int> _a) {
- int n = (int)_a.size();
- a = _a;
- sum.resize(4 * n);
- build(0, 0, n);
- }
- void build(int id, int l, int r) {
- if (l + 1 == r) {
- sum[id] = a[l];
- return;
- }
- int m = (l + r) / 2;
- build(id * 2 + 1, l, m);
- build(id * 2 + 2, m, r);
- sum[id] = sum[id * 2 + 1] + sum[id * 2 + 2];
- }
- void update(int id, int l, int r, int i, int x) {
- if (l + 1 == r) {
- sum[id] = x;
- return;
- }
- int m = (l + r) / 2;
- if (i < m) {
- update(id * 2 + 1, l, m, i, x);
- } else {
- update(id * 2 + 2, m, r, i, x);
- }
- sum[id] = sum[id * 2 + 1] + sum[id * 2 + 2];
- }
- ll get_sum(int id, int l, int r, int lq, int rq) {
- if (r <= lq || l >= rq) {
- return 0;
- }
- if (lq <= l && r <= rq) {
- return sum[id];
- }
- int m = (l + r) / 2;
- ll sum1 = get_sum(id * 2 + 1, l, m, lq, rq);
- ll sum2 = get_sum(id * 2 + 2, m, r, lq, rq);
- return sum1 + sum2;
- }
- void write(int id, int l, int r) {
- if (l + 1 == r) {
- cout << sum[id] << " ";
- return;
- }
- int m = (l + r) / 2;
- write(id * 2 + 1, l, m);
- write(id * 2 + 2, m, r);
- }
- };
- int main()
- {
- fast
- //file_in
- int n, m;
- cin >> n >> m;
- vector<int> w(n);
- for (auto &it : w) cin >> it;
- seg_tree s(w);
- int type, l, r, i, v;
- while(m--) {
- cin >> type;
- //s.write(0, 0, n);
- //cout << endl;
- if (type == 1) {
- cin >> i >> v;
- s.update(0, 0, n, i, v);
- } else if (type == 2) {
- cin >> l >> r;
- cout << s.get_sum(0, 0, n, l, r) << "\n";
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment