Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/extc++.h>
- #define int int64_t
- using namespace std;
- using namespace __gnu_pbds;
- const int N = 2e5 + 1;
- const int C = 1;
- array<int, N> a, sum, push;
- void update(int i, int x) {
- sum[i / C] -= a[i];
- a[i] += x;
- sum[i / C] += a[i];
- }
- void update(int l, int r, int x) {
- int bl = l / C;
- int br = r / C;
- if (bl == br) {
- for (int i = l; i <= r; ++i) {
- update(i, x);
- }
- return;
- }
- for (int i = bl + 1; i < br; i++) {
- sum[i] += C * x;
- push[i] += x;
- }
- for (int i = l; i < (bl + 1) * C; i++) {
- update(i, x);
- }
- for (int i = br * C; i <= r; i++) {
- update(i, x);
- }
- }
- void build(int n) {
- for (int i = 0; i < n; i++) {
- sum[i / C] += a[i];
- }
- }
- int get(int l, int r) {
- int bl = l / C;
- int br = r / C;
- if (bl == br) {
- int ans = 0;
- for (int i = l; i <= r; ++i) {
- ans += a[i];
- }
- return ans;
- }
- int ans = 0;
- for (int i = bl + 1; i < br; i++) {
- ans += sum[i];
- }
- for (int i = l; i < (bl + 1) * C; i++) {
- ans += a[i] + push[bl];
- }
- for (int i = br * C; i <= r; i++) {
- ans += a[i] + push[br];
- }
- return ans;
- }
- int32_t main(){
- ios::sync_with_stdio(false);
- cin.tie(nullptr);
- int n;
- cin >> n;
- int q;
- cin >> q;
- for (int i = 0; i < n; i++) {
- cin >> a[i];
- }
- build(n);
- while (q--) {
- int tp;
- cin >> tp;
- if (tp == 3) {
- int i, x;
- cin >> i >> x;
- i--;
- update(i, x);
- } else if (tp == 2) {
- int l, r, x;
- cin >> l >> r >> x;
- l--, r--;
- update(l, r, x);
- } else if (tp == 1) {
- int l, r;
- cin >> l >> r;
- l--, r--;
- cout << get(l, r) << '\n';
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment