Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cmath>
- #include <cstdio>
- #include <vector>
- #define ULL unsigned long long
- #define LL long long
- #define uint unsigned int
- #define uchar unsigned char
- #define IS_EVEN(x) (((x) & 1U) == 0)
- uint n, n0, q;
- std::vector<int> a;
- std::vector<LL> t;
- void build() {
- for (int i = 1; i <= n; i++) {
- t[i + n - 1] = a[i];
- }
- for (int i = n - 1; i > 0; i--) {
- t[i] = t[i * 2] + t[i * 2 + 1];
- }
- return;
- }
- LL get_sum(int l, int r) {
- l += n - 1;
- r += n - 1;
- LL sum = 0;
- while (l <= r) {
- if (!IS_EVEN(l)) {
- sum += t[l];
- l += 1;
- }
- if (IS_EVEN(r)) {
- sum += t[r];
- r -= 1;
- }
- l /= 2;
- r /= 2;
- }
- // sum += t[l];
- return sum;
- }
- void change(int i, int v) {
- i += n - 1;
- int d = v - t[i];
- while (i != 0) {
- t[i] += d;
- i /= 2;
- }
- return;
- }
- int main(void) {
- scanf("%d %d", &n0, &q);
- n = 1 << (uint)ceil(log2(n0));
- // printf(" %u\n", n);
- a.resize(n + 1, 0);
- t.resize(2 * n, 0);
- for (int i = 1; i <= n0; i++) {
- scanf("%d", &a[i]);
- }
- build();
- uchar op;
- int o1, o2;
- for (int i = 0; i < q; i++) {
- scanf("%hhu %d %d", &op, &o1, &o2);
- if (op == 1) {
- change(o1, o2);
- } else {
- printf("%llu\n", get_sum(o1, o2));
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement