Link to this code: https://cses.fi/paste/e46fc0236a874a04f11078/
/**
 * Problem: Range Update Queries (CSES 1651)
 * Link: https://cses.fi/problemset/task/1651/
 * Difficulty: Easy
 *
 * -------------------------
 * Short Problem Statement
 * -------------------------
 * You are given an array of N integers and Q queries of two types:
 * 1. Add a value `u` to all elements in the range [a, b].
 * 2. Query the current value at a specific position `k`.
 *
 * -------------------------
 * Approach (Difference Array + Fenwick Tree)
 * -------------------------
 * A plain Difference Array supports range updates in O(1),
 * but retrieving a single element requires computing a prefix sum,
 * resulting in O(N) per query — too slow for large Q.
 *
 * To handle both operations efficiently:
 *
 * 1. Difference Array Concept:
 *    - A range update [L, R] by +X can be represented as:
 *        diff[L]     += X
 *        diff[R + 1] -= X
 *
 * 2. Fenwick Tree (Binary Indexed Tree):
 *    - We store the difference array updates inside a Fenwick Tree.
 *    - This allows both updates and prefix-sum queries in O(log N).
 *
 * 3. Point Value Retrieval:
 *    - The final value at index `k` is:
 *        initial_array[k] + prefix_sum(diff, k)
 *
 * -------------------------
 * Time & Space Complexity
 * -------------------------
 * Time Complexity:  O((N + Q) log N)
 * Space Complexity: O(N)
 */

#include <bits/stdc++.h>
using namespace std;

const int MAXN = 200005;
long long bit[MAXN];
int n, q;

// Fenwick Tree update (1-based indexing)
void update(int idx, long long val) {
    for (; idx <= n; idx += idx & -idx) {
        bit[idx] += val;
    }
}

// Fenwick Tree prefix sum query
long long query(int idx) {
    long long sum = 0;
    for (; idx > 0; idx -= idx & -idx) {
        sum += bit[idx];
    }
    return sum;
}

void solve() {
    cin >> n >> q;

    vector<long long> initial_arr(n + 1);
    for (int i = 1; i <= n; i++) {
        cin >> initial_arr[i];
    }

    while (q--) {
        int type;
        cin >> type;

        if (type == 1) {
            // Range update: add u to [a, b]
            int a, b;
            long long u;
            cin >> a >> b >> u;
            update(a, u);
            update(b + 1, -u);
        } else {
            // Point query: get value at k
            int k;
            cin >> k;
            cout << initial_arr[k] + query(k) << '\n';
        }
    }
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    solve();
    return 0;
}