제출 #1308717

#제출 시각아이디문제언어결과실행 시간메모리
1308717ender_shayanBitaro, who Leaps through Time (JOI19_timeleap)C++20
100 / 100
545 ms54008 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 ll mod = 1e9+7 ;// 998244353 ;// 1e9+9; ll inf=1e18; const int N=1<<19,L=21,bs=701,NN=1e6; int n,m,k,q; struct Node{ int l,r; bool v; ll ans; }seg[2][N*2],cl; Node merg(Node a,Node b){ if(a.l==-1)return b; if(b.l==-1)return a; Node c=cl;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; c.ans+=max(0,a.l-b.r); if(a.r<b.l){c.l=a.r;c.r=b.l;} else {c.l=a.l;c.r=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; } 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; // cout<<l<<" "<<r<<":"<<seg[v].l<<" "<<seg[v].r<<" "<<seg[v].v<<endl; 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]); // cout<<l<<" "<<r<<":"<<seg[v].l<<" "<<seg[v].r<<" "<<seg[v].v<<endl; } 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...