Untitled
unknown
plain_text
a year ago
2.4 kB
10
Indexable
#include <bits/stdc++.h>
using namespace std;
struct segTree {
vector<long long> seg;
vector<long long> lazy;
long long n, init;
segTree(int _n, long long initELEMENT) {
n = 1, init = initELEMENT;
while (n < _n) n <<= 1;
seg.assign(2 * n, {initELEMENT});
lazy.assign(2 * n, {initELEMENT});
}
long long calc(long long x, long long y) {
return x + y;
}
void addToLazy(int u, long long sz, long long val) {
lazy[u] += val;
}
void pushToSEG(int u, long long sz) {
seg[u] += lazy[u] * sz;
if (u < n)
for (int i = 0; i < 2; ++i)
lazy[u * 2 + i] += lazy[u];
lazy[u] = 0;
}
void pull(int u, long long sz) {
if (u < n)
seg[u] = calc(seg[u * 2], seg[u * 2 + 1]);
}
void update(int l, int r, long long val) {
update(1, 0, n - 1, l, r, val);
}
void update(int u, int L, int R, int l, int r, long long val) {
pushToSEG(u, R - L + 1);
if (R < l || L > r) return;
if (L >= l && R <= r) {
addToLazy(u, R - L + 1, val);
pushToSEG(u, R - L + 1);
return;
}
int M = (L + R) / 2;
update(u * 2, L, M, l, r, val);
update(u * 2 + 1, M + 1, R, l, r, val);
pull(u, R - L + 1);
}
long long query(int l, int r) { return query(1, 0, n - 1, l, r); }
long long query(int u, int L, int R, int l, int r) {
pushToSEG(u, R - L + 1);
if (L > r || R < l) return init;
if (L >= l && R <= r) {
return seg[u];
}
int M = (L + R) / 2;
long long resL = query(u * 2, L, M, l, r);
long long resR = query(u * 2 + 1, M + 1, R, l, r);
return calc(resL, resR);
}
};
int main () {
int n, q;
cin >> n >> q;
segTree seg(n, 0);
for (int i = 0; i < n; ++i) {
int x;
cin >> x;
seg.update(i, i, x);
}
for (int i = 0; i < q; ++i) {
int ty;
cin >> ty;
if (ty == 1) {
long long l, r, val;
cin >> l >> r >> val;
--l, --r;
seg.update(l, r, val);
} else {
int k;
cin >> k;
--k;
cout << seg.query(k, k) << "\n";
}
}
}Editor is loading...
Leave a Comment