Cod sursa(job #3184824)

Utilizator daliso2836daliso daliso2836 Data 16 decembrie 2023 23:58:05
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.83 kb
/**
 * author:  xdaruis
 * created: 16.12.2023 23:38:27
**/
// #pragma comment(linker, "/stack:200000000")
// #pragma comment(linker, "/stack:256000000")
#pragma GCC optimize("O3")
// #pragma GCC target ("avx2")
// #pragma GCC optimize("Ofast")
// #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
// #pragma GCC optimize("unroll-loops")
#include <bits/stdc++.h>
using namespace std;

using vi = vector<int>;
using ll = long long;
using ull = unsigned long long;
using lld = long double;
constexpr int md = 1e9 + 7;
constexpr int md1 = 998244353;
constexpr ll inf = 1e18;
const vector<pair<int, int>> dir8{{-1, 0}, {-1, 1}, {0, 1}, {1, 1}, {1 , 0}, {1, -1}, {0, -1}, {-1, -1}};
const vector<pair<int, int>> dir4{{-1, 0}, {0, 1}, {1 , 0}, {0, -1}};

#define all(x) (x).begin(), (x).end()

#ifdef LOCAL
template<typename A, typename B> ostream& operator<<(ostream &os, const pair<A, B> &p) { return os << '(' << p.first << ", " << p.second << ')'; }
template<typename T_container, typename T = typename enable_if<!is_same<T_container, string>::value, typename T_container::value_type>::type> ostream& operator<<(ostream &os, const T_container &v) { os << '{'; string sep; for (const T &x : v) os << sep << x, sep = ", "; return os << '}'; }
void dbg_out() { cerr << '\n'; }
template<typename Head, typename... Tail> void dbg_out(Head H, Tail... T) { cerr << ' ' << H; dbg_out(T...); }
#define deb(...) cerr << #__VA_ARGS__ << "->", dbg_out(__VA_ARGS__);
#define START auto start_time = chrono::high_resolution_clock::now();
#define END cerr << "Execution Time: " << chrono::duration_cast<chrono::milliseconds>(chrono::high_resolution_clock::now() - start_time).count() << " ms\n";
#define ROAD_TO_GM cerr << "Solved: " << t << '\n';
#else
#define deb(...)
#define START
#define END
#define ROAD_TO_GM
#endif

ifstream fin("datorii.in");
ofstream fout("datorii.out");
#define cin fin
#define cout fout

// #define double lld
// #define int ll
// #define vi vector<ll>


/**
 * Author: Lucian Bicsi
 * Description: Very fast and quick segment tree.
 * Only useful for easy invariants. 0-indexed.
 * Range queries are half-open.
 * Source: https://github.com/bicsi/kactl/blob/master/content/data-structures/SegmentTree.h
**/

struct SegmTree {
    const int _VAL = 0;
    vector<int> T; int n;

    SegmTree(int size) : T(2 * size, _VAL), n(size) {}

    SegmTree(const vector<int>& arr) : T(2 * arr.size(), _VAL),
        n((int)arr.size()) {
        for (int i = 0; i < n; ++i) {
            T[n + i] = arr[i];
        }
        for (int i = n - 1; i > 0; --i) {
            T[i] = T[2 * i] + T[2 * i + 1];
        }
    }

    void Update(int pos, int val) {
        for (T[pos += n] = val; pos > 1; pos /= 2) {
            T[pos / 2] = T[pos] + T[pos ^ 1];
        }
    }

    int Query(int l, int r) {
        int res = 0;
        for (l += n, r += n + 1; l < r; l /= 2, r /= 2) {
            if (l % 2) {
                res += T[l++];
            }
            if (r % 2) {
                res += T[--r];
            }
        }
        return res;
    }
};


void solve() {
    int n, q;
    cin >> n >> q;
    vi nums(n);
    for (int& i : nums) {
        cin >> i;
    }
    SegmTree st(nums);
    deb(st.T);
    while (q--) {
        int a, l, r;
        cin >> a >> l >> r;
        if (a == 0) {
            st.Update(l - 1, st.T[l - 1 + n] - r);
        } else {
            cout << st.Query(l - 1, r - 1) << '\n';
        }
    }
}

signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    // freopen("input.txt", "r", stdin);
    // freopen("output.txt", "w", stdout);

    int T = 1;
    // cin >> T;
    deb(T);
    for (int t = 1; t <= T; ++t) {
        solve();
        // cout << '\n';
        ROAD_TO_GM
    }
    return 0;
}