Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <algorithm>
- using namespace std;
- const int INF = 1e9;
- void build(vector<long long>& z, vector<int>& a, int& n, int l, int r, int now) {
- if (l > r) {
- return;
- }
- else if (l == r) {
- z[now] = a[l];
- return;
- }
- int mid = (l + r) / 2;
- build(z, a, n, l, mid, now * 2);
- build(z, a, n, mid + 1, r, now * 2 + 1);
- z[now] = max(z[now * 2], z[now * 2 + 1]);
- }
- long long query(vector<long long>& z, int l, int r, int a, int b, int now) {
- if (l > r || a > r || b < l) {
- return -INF;
- }
- if (a <= l && b >= r) {
- return z[now];
- }
- int mid = (l + r) / 2;
- return max(query(z, l, mid, a, b, now * 2), query(z, mid + 1, r, a, b, now * 2 + 1));
- }
- long long add(int n, vector<long long>& z, int l, int r, int a, int b, int now, long long delta) {
- if (a > r || b < l) {
- return z[now];
- }
- if (l == r) {
- if (a <= l && r <= b) {
- z[now] += delta;
- }
- return z[now];
- }
- int mid = (l + r) / 2;
- long long _1 = add(n, z, l, mid, a, b, now * 2, delta);
- long long _2 = add(n, z, mid + 1, r, a, b, now * 2 + 1, delta);
- z[now] = max(_1, _2);
- return z[now];
- }
- int main()
- {
- int n;
- cin >> n;
- vector<int> a(n);
- for (int i = 0; i < n; ++i) {
- cin >> a[i];
- }
- vector<long long> z(n * 2, 0);
- build(z, a, n, 0, n - 1, 1);
- int m;
- cin >> m;
- for (int i = 0; i < m; ++i) {
- char c;
- int l, r;
- cin >> c >> l >> r;
- if (c == 'm') {
- cout << query(z, 0, n - 1, l - 1, r - 1, 1) << " ";
- }
- else {
- long long delta;
- cin >> delta;
- delta = add(n, z, 0, n - 1, l - 1, r - 1, 1, delta);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement