Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- #define F first
- #define S second
- #define int long long
- using namespace std;
- vector<int> a;
- vector<pair<int,int>> t;
- int sz;
- void build(){
- for(int i = 0; i < sz; i++){
- t[i+sz].F = a[i];
- }
- for(int i = sz-1; i >= 1;i--){
- t[i].F = max(t[2*i].F,t[2*i+1].F);
- }
- }
- void push(int v, int tl, int tr){
- if(!t[v].S) return;
- if(tl == tr){
- t[v].F += t[v].S;
- t[v].S = 0;
- return;
- }
- t[v].F = t[v].S + max(t[2 * v].F + t[2 * v].S, t[2 * v + 1].F + t[2 * v + 1].S);
- t[2 * v].S += t[v].S;
- t[2 * v + 1].S += t[v].S;
- t[v].S = 0;
- }
- void upd(int v, int tl, int tr, int l, int r, int x){
- push(v, tl, tr);
- if(l > tr || tl > r){
- return;
- }
- if(l == tl && tr == r){
- t[v].S += x;
- push(v, tl, tr);
- return;
- }
- int tm = (tl + tr) / 2;
- upd(2 * v, tl, tm, l, min(r, tm), x);
- upd(2 * v + 1, tm + 1, tr, max(l, tm+1), r, x);
- t[v].F = t[v].S + max(t[2 * v].F + t[2 * v].S, t[2 * v + 1].F + t[2 * v + 1].S);
- push(v, tl, tr);
- }
- int get(int v, int tl, int tr, int l, int r){
- push(v, tl, tr);
- if(l > tr || tl > r){
- return -1e9;
- }
- if(tl == l && tr == r){
- return t[v].F;
- }
- int tm = (tl + tr) / 2;
- return max(get(2 * v, tl, tm, l, min(r,tm)), get(2 * v + 1, tm + 1, tr, max(l,tm+1), r));
- }
- signed main()
- {
- ios_base::sync_with_stdio(0);
- cin.tie(0);
- cout.tie(0);
- int n;
- cin >> n;
- sz = 1;
- while(sz <= n){
- sz *= 2;
- }
- sz *= 2;
- t.assign(2 * sz + 2, {-1e9,0});
- a.assign(sz, -1e9);
- for(int i = 0; i < n; i++){
- cin >> a[i];
- }
- build();
- int m;
- cin >> m;
- for(int i = 0; i < m; i++){
- string s;
- cin >> s;
- if(s == "m"){
- int l, r;
- cin >> l >> r;
- cout << get(1, 1, sz, l, r) << " ";
- }
- if(s == "a"){
- int l, r, x;
- cin >> l >> r >> x;
- upd(1, 1, sz, l, r, x);
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment