#include <bits/stdc++.h>
using namespace std;
#define ll long long
// type,ans+,ansmx, (tmin,tmax) | t.
vector<ll> comb(vector<ll> a,vector<ll> b)
{
    vector<ll> ans;
    if(a[0] == 0 && b[0] == 0)
    {
        if(a[4] >= b[3] && b[4] >= a[3])
        {
            ans.push_back(0);
            ans.push_back(min(a[4],b[4])*-1);
            ans.push_back(min(a[4],b[4]));
            ans.push_back(max(a[3],b[3]));
            ans.push_back(min(a[4],b[4]));
        }
        else
        {
            if(a[4] < b[3])
            {
                ans.push_back(1);
                ans.push_back(a[1]);
                ans.push_back(a[2]);
                ans.push_back(b[3]);
            }
            else
            {
                ans.push_back(1);
                ans.push_back(a[3]*-1 + a[3] - b[4]);
                ans.push_back(a[3]);
                ans.push_back(b[4]);
            }
        }
    }
    else if(a[0] == 1 && b[0] == 0)
    {
        ans.push_back(1);
        ans.push_back(a[1]+b[1]+max(b[2],a[3]));
        ans.push_back(a[2]);
        ans.push_back(min(max(a[3],b[3]),b[4]));
    }
    else if(a[0] == 0 && b[0] == 1)
    {
        ans.push_back(1);
        ans.push_back(a[1]+b[1]);
        ans.push_back(max(a[2],b[2]));
        ans.push_back(b[3]);
        if(a[3] > b[2])
        {
            ans[1] += a[3] -b[2];
            ans[2] = a[3];
        }
    }
    else
    {
        ans.push_back(1);
        ans.push_back(a[1]+b[1]+max(b[2],a[3]));
        ans.push_back(a[2]);
        ans.push_back(b[3]);
    }
    return ans;
}
const int ize = 4; //20
int n,q;
vector<ll> tr[(1<<ize)];
void add(int p,pair<ll,ll> v)
{
    p+=(1<<(ize-1));
    tr[p] = {0,v.second*-1,v.second,v.first,v.second};
    p/=2;
    while( p > 0)
    {
        tr[p] = comb(tr[p*2],tr[p*2+1]);
        p/=2;
    }
}
pair<ll,ll> check(int l,int r,ll s)
{
    l+=(1<<(ize-1));
    r+=(1<<(ize-1));
    pair<ll,ll> cu = {0,s};
    vector<vector<ll>> lv;
    vector<vector<ll>> rv;
    lv.push_back(tr[l]);
    if(l != r) rv.push_back(tr[r]);
    while(l/2 != r/2)
    {
        if(l%2 == 0) lv.push_back(tr[l+1]);
        if(r%2 == 1) rv.push_back(tr[r-1]);
        l/=2;r/=2;
    }
    reverse(rv.begin(),rv.end());
    for(int i = 0;i<rv.size();i++)
    {
        lv.push_back(rv[i]);
    }
    for(int i = 0;i<lv.size();i++)
    {
        //cout<<cu.second<<"\n";
        cu.first+=lv[i][1];
        cu.first+=max(lv[i][2],cu.second);
        if(lv[i][0] == 0)
        {
            cu.second = max(lv[i][3],cu.second);
            cu.second = min(lv[i][4],cu.second);
        }
        else
        {
            cu.second = lv[i][3];
        }
    }
    return cu;
}
vector<ll> tr2[(1<<ize)];
void add2(int p,pair<ll,ll> v)
{
    p+=(1<<(ize-1));
    tr2[p] = {0,v.second*-1,v.second,v.first,v.second};
    p/=2;
    while( p > 0)
    {
        tr2[p] = comb(tr2[p*2],tr2[p*2+1]);
        p/=2;
    }
}
pair<ll,ll> check2(int l,int r,ll s)
{
    //cout<<s<<"\n";
    l+=(1<<(ize-1));
    r+=(1<<(ize-1));
    pair<ll,ll> cu = {0,s};
    vector<vector<ll>> lv;
    vector<vector<ll>> rv;
    lv.push_back(tr2[l]);
    if(l != r) rv.push_back(tr2[r]);
    while(l/2 != r/2)
    {
        if(l%2 == 0) lv.push_back(tr2[l+1]);
        if(r%2 == 1) rv.push_back(tr2[r-1]);
        l/=2;r/=2;
    }
    reverse(rv.begin(),rv.end());
    for(int i = 0;i<rv.size();i++)
    {
        lv.push_back(rv[i]);
    }
    for(int i = 0;i<lv.size();i++)
    {
        //cout<<cu.second<<"\n";
        cu.first+=lv[i][1];
        cu.first+=max(lv[i][2],cu.second);
        if(lv[i][0] == 0)
        {
            cu.second = max(lv[i][3],cu.second);
            cu.second = min(lv[i][4],cu.second);
        }
        else
        {
            cu.second = lv[i][3];
        }
    }
    return cu;
}
pair<ll,ll> prz[299999];
int main()
{
    cin>>n>>q;
    for(int i = 0;i<(1<<ize);i++)
    {
        tr[i] = {0,-1000000000,1000000000,-1000000000,1000000000};
        tr2[i] = {0,-1000000000,1000000000,-1000000000,1000000000};
    }
    for(int i = 0;i<n-1;i++)
    {
        cin>>prz[i].first>>prz[i].second;
        add(i,{prz[i].first-i,prz[i].second-i-1});
        int j = (n-1)-i-1;
        add2(j,{prz[i].first-j,prz[i].second-j-1});
    }
    /*
    for(int i = 1;i<(1<<ize);i++)
    {
        for(int j = 0;j<tr[i].size();j++)
        {
            cout<<tr[i][j]<<" ";
        }
        cout<<"\n";
    }*/
    for(int i = 0;i<q;i++)
    {
        int t;
        cin>>t;
        if(t == 1)
        {
            ll p,s,e;
            cin>>p>>s>>e;
            p--;
            add(p,{s-p,e-p-1});
            int j = (n-1)-p-1;
            add2(j,{s-j,e-j-1});
        }
        else
        {
            ll a,b,c,d;
            cin>>a>>b>>c>>d;
            a--;
            c--;
            if(a < c)
            {
                b-=a;
                d-=c;
                pair<ll,ll> ans = check(a,c-1,b);
                cout<<ans.first + max(0ll,ans.second-d)<<"\n";
            }
            else if(c < a)
            {
                a--;
                a = (n-1)-a-1;
                c = (n-1)-c-1;
                b-=a;
                d-=c+1;
                pair<ll,ll> ans = check2(a,c,b);
                cout<<ans.first + max(0ll,ans.second-d)<<"\n";
            }
            else
            {
                cout<<max(0ll,b-d)<<"\n";
            }
        }
    }
}
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |