Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #pragma GCC optmize("Ofast")
- #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,tune=native")
- #pragma GCC optimize("unroll-loops")
- #include <bits/stdc++.h>
- using namespace std;
- #define forn(i, s, f) for (int i = s; i < f; i++)
- #define pii pair <int, int>
- #define fs first
- #define sc second
- #define pb push_back
- #define all(x) (x).begin(), (x).end()
- typedef long long ll;
- vector <int> tr, a, to_add;
- void build(int v, int vl, int vr) {
- if (vr - vl == 1) {
- tr[v] = a[vl];
- return;
- }
- int vm = (vl + vr) / 2;
- build(2 * v, vl, vm), build(2 * v + 1, vm, vr);
- tr[v] = max(tr[2 * v], tr[2 * v + 1]);
- }
- void push(int v, int vl, int vr) {
- if (vr - vl != 1) {
- to_add[2 * v] += to_add[v];
- to_add[2 * v + 1] += to_add[v];
- }
- tr[v] += to_add[v];
- to_add[v] = 0;
- }
- void add(int v, int vl, int vr, int l, int r, int x) {
- push(v, vl, vr);
- if (vr <= l || r <= vl)
- return;
- if (l <= vl && vr <= r) {
- to_add[v] += x;
- push(v, vl, vr);
- return;
- }
- int vm = (vl + vr) / 2;
- add(2 * v, vl, vm, l, r, x), add(2 * v + 1, vm, vr, l, r, x);
- tr[v] = max(tr[2 * v], tr[2 * v + 1]);
- }
- int get(int v, int vl, int vr, int l, int r) {
- //cout << v << "\n";
- push(v, vl, vr);
- if (vr <= l || r <= vl)
- return -1;
- if (l <= vl && vr <= r)
- return tr[v];
- int vm = (vl + vr) / 2;
- return max(get(2 * v, vl, vm, l, r), get(2 * v + 1, vm, vr, l, r));
- }
- int main() {
- ios_base::sync_with_stdio(0), cin.tie(0);
- int n;
- cin >> n;
- tr.resize(4 * n, -1), to_add.resize(4 * n), a.resize(n);
- forn (i, 0, n)
- cin >> a[i];
- build(1, 0, n);
- int q;
- cin >> q;
- while (q --> 0) {
- char c;
- cin >> c;
- if (c == 'm') {
- int l, r;
- cin >> l >> r;
- l--;
- cout << get(1, 0, n, l, r) << " ";
- } else {
- int l, r, x;
- cin >> l >> r >> x;
- l--;
- add(1, 0, n, l, r, x);
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement