Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- int n;
- vector<long> a, t, add;
- void build(int v, int l, int r){
- if (l == r)
- t[v] = a[l];
- else{
- int m = (l+r)/2;
- build(2*v, l, m);
- build(2*v+1, m+1, r);
- t[v] = max(t[2*v], t[2*v+1]);
- }
- }
- void push(int v){
- if (add[v] != 0){
- t[2*v] += add[v];
- t[2*v+1] += add[v];
- add[2*v] += add[v]; add[2*v+1] += add[v];
- add[v] = 0;
- }
- }
- int get(int v, int l, int r, int tl, int tr){
- if (l > r) return -INT_MAX;
- if (l == tl && r == tr)
- return t[v];
- push(v);
- int m = (l+r)/2;
- return max(get(2*v+1, m+1, r, max(m+1, tl), tr), get(2*v, l, m, tl, min(tr, m)));
- }
- void update(int v, int l, int r, int tl, int tr, int a){
- if (l > r) return;
- if (l == tl && r == tr) {
- t[v] += a;
- add[v] += a;
- return;
- }
- int m = (l+r)/2;
- push(v);
- update(2*v+1, m+1, r, max(tl, m+1), tr, a);
- update(2*v, l, m, tl, min(tr, m), a);
- t[v] = max(t[2*v], t[2*v+1]);
- }
- int main(){
- ios_base::sync_with_stdio(0); cout.tie(0); cin.tie(0);
- cin >> n; a.resize(n); t.resize(4*n+4); add.resize(4*n+4);
- for (int i = 0; i < n;++i)
- cin >> a[i];
- build(1, 0, n-1);
- int k; cin >> k;
- char ch; int l, r, w;
- for (int i = 0; i < k; ++i){
- cin >> ch;
- if (ch == 'm'){
- cin >> l >> r;
- cout << get(1, 0, n-1, l-1, r-1) << ' ';
- }
- else{
- cin >> l >> r >> w;
- update(1, 0, n-1, l-1, r-1, w);
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement