Submission #1308718

#TimeUsernameProblemLanguageResultExecution timeMemory
1308718ender_shayanBitaro, who Leaps through Time (JOI19_timeleap)C++20
100 / 100
426 ms53904 KiB
#include <bits/stdc++.h>

using namespace std;

// #include <ext/pb_ds/assoc_container.hpp>
// #include <ext/pb_ds/tree_policy.hpp>
// using namespace __gnu_pbds;

typedef long long ll;
typedef long double	ld;
typedef pair<int, int>	pii  ;
typedef pair<ll, ll>	pll  ;
typedef vector<pii>     vii  ;
typedef vector<int>     veci ;
typedef vector<pll>     vll  ;
typedef vector<ll>      vecll;

// find_by_order             order_of_key

#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")
#define ordered_set tree<int, null_type,less<int>, rb_tree_tag,tree_order_statistics_node_update>
#define F		        first
#define S		        second
#define pb		        push_back
#define endl            '\n'
#define Mp		        make_pair
#define all(x)          x.begin(), x.end()
#define debug(x)        cerr << #x << " = " << x << endl
#define set_dec(x)	    cout << fixed << setprecision(x);
#define fast_io         ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define file_io         freopen("in.txt" , "r" , stdin) ; freopen("out.txt" , "w" , stdout);
#define lb              lower_bound
#define ub              upper_bound
#define for1(n)         for(int i=1;i<=n;i++)
#define for0(n)         for(int i=0;i<n;i++)
#define forn(n)         for(int i=n;i>0;i--)
#define pq              priority_queue <pii, vector<pii>, greater<pii>>


const int N=1<<19;
int n,m,k,q;

struct Node{
    int l,r;
    bool v;
    ll ans;
}seg[2][N*2],cl;
inline Node merg(Node a,Node b){
    if(a.l==-1)return b;
    if(b.l==-1)return a;
    Node c;c.ans=a.ans+b.ans;c.v=a.v|b.v;
    if(a.v==0 && b.v==0){
        c.l=max(a.l,b.l);
        c.r=min(a.r,b.r);
        if(c.l<=c.r)return c;
        c.v=1;
        if(a.r<b.l){c.l=a.r;c.r=b.l;}
        else {c.l=a.l;c.r=b.r;c.ans+=a.l-b.r;}
        return c;
    }
    if(a.v==0 && b.v==1){
        c.r=b.r;
        if(a.l<=b.l && b.l<=a.r)
            c.l=b.l;
        else if(a.r<b.l)
            c.l=a.r;
        else{
            c.l=a.l;
            c.ans+=a.l-b.l;
        }
        return c;
    }
    if(a.v==1 && b.v==0){
        c.l=a.l;
        if(b.l<=a.r && a.r<=b.r)
            c.r=a.r;
        else if(a.r<b.l)
            c.r=b.l;
        else{
            c.r=b.r;
            c.ans+=a.r-b.r;
        }
        return c;
    }
    c.l=a.l;
    c.r=b.r;
    c.ans+=max(a.r-b.l,0);
    return c;
}
inline void upd(int t,int i,int x,int y,int l=1,int r=n,int v=1){
    if(r-l==1){
        seg[t][v].l=x;
        seg[t][v].r=y;
        return;
    }
    int mid=(l+r)>>1;
    if(i<mid)upd(t,i,x,y,l,mid,v<<1);
    else upd(t,i,x,y,mid,r,v<<1|1);
    seg[t][v]=merg(seg[t][v<<1],seg[t][v<<1|1]);
}
inline Node get(int t,int lx,int rx,int l=1,int r=n,int v=1){
    if(lx>=r || rx<=l)return cl;
    if(lx<=l && r<=rx)return seg[t][v];
    int mid=(l+r)>>1;
    return merg(get(t,lx,rx,l,mid,v<<1),get(t,lx,rx,mid,r,v<<1|1));
}
int main(){
    fast_io
    cl.l=-1;
    cin>>n>>q;
    for1(n-1){
        int l,r;cin>>l>>r;r--;
        upd(0,i,l+n-i,r+n-i);
        upd(1,n-i,l+i,r+i);
    }
    while(q--){
        int t;cin>>t;
        if(t==1){
            int i,l,r;cin>>i>>l>>r;r--;
            upd(0,i,l+n-i,r+n-i);
            upd(1,n-i,l+i,r+i);
        }
        else{
            int lx,rx,a,b;cin>>lx>>a>>rx>>b;
            int t=0;
            if(lx>rx){
                lx=n+1-lx;
                rx=n+1-rx;
                t=1;
            }
            a+=n-lx;b+=n-rx;
            Node tmp=get(t,lx,rx),tmp2=cl,tmp3=cl;
            tmp2.l=tmp2.r=a;
            tmp3.l=tmp3.r=b;
            tmp=merg(merg(tmp2,tmp),tmp3);
            cout<<tmp.ans<<endl;
        }
    }





}



#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...