Submission #717153

#TimeUsernameProblemLanguageResultExecution timeMemory
717153Urvuk3Wall (IOI14_wall)C++17
100 / 100
887 ms99468 KiB
#include "wall.h" #include <bits/stdc++.h> using namespace std; #define ll long long const int INF=1e9; const ll LINF=1e18; #define fi first #define se second #define pii pair<int,int> #define mid ((l+r)/2) #define sz(a) (int((a).size())) #define all(a) a.begin(),a.end() #define endl "\n" #define pb push_back void PRINT(int x) {cerr << x;} void PRINT(ll x) {cerr << x;} void PRINT(double x) {cerr << x;} void PRINT(char x) {cerr << '\'' << x << '\'';} void PRINT(string x) {cerr << '\"' << x << '\"';} void PRINT(bool x) {cerr << (x ? "true" : "false");} template<typename T,typename V> void PRINT(pair<T,V>& x){ cerr<<"{"; PRINT(x.fi); cerr<<","; PRINT(x.se); cerr<<"}"; } template<typename T> void PRINT(T &x){ int id=0; cerr<<"{"; for(auto _i:x){ cerr<<(id++ ? "," : ""); PRINT(_i); } cerr<<"}"; } void _PRINT(){ cerr<<"]\n"; } template<typename Head,typename... Tail> void _PRINT(Head h,Tail... t){ PRINT(h); if(sizeof...(t)) cerr<<", "; _PRINT(t...); } #define Debug(x...) cerr<<"["<<#x<<"]=["; _PRINT(x) vector<pii> seg; pii Merge(pii p,pii q){ if(p.fi<=q.fi && q.fi<=p.se) p.fi=q.fi; else if(q.fi>p.se){ p.fi=q.fi; p.se=q.fi; } if(p.fi<=q.se && q.se<=p.se) p.se=q.se; else if(q.se<p.fi){ p.fi=q.se; p.se=q.se; } return p; } void Propagate(int node,int l,int r){ if(l!=r){ seg[2*node]=Merge(seg[2*node],seg[node]); seg[2*node+1]=Merge(seg[2*node+1],seg[node]); seg[node]={0,INF}; } } void UpdateR(int node,int l,int r,int L,int R,int x){ Propagate(node,l,r); if(L<=l && r<=R){ seg[node]=Merge(seg[node],{0,x}); return; } if(L<=mid) UpdateR(2*node,l,mid,L,R,x); if(R>mid) UpdateR(2*node+1,mid+1,r,L,R,x); } void UpdateL(int node,int l,int r,int L,int R,int x){ Propagate(node,l,r); if(L<=l && r<=R){ seg[node]=Merge(seg[node],{x,INF}); return; } if(L<=mid) UpdateL(2*node,l,mid,L,R,x); if(R>mid) UpdateL(2*node+1,mid+1,r,L,R,x); } pii Query(int node,int l,int r,int idx){ if(l==r){ return seg[node]; } pii q; if(idx<=mid) q=Query(2*node,l,mid,idx); else q=Query(2*node+1,mid+1,r,idx); return Merge(q,seg[node]); } void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[]){ seg.resize(4*n+1,{0,INF}); for(int i=0;i<k;i++){ int tp=op[i]; int l=left[i]; int r=right[i]; int x=height[i]; if(tp==1) UpdateL(1,0,n-1,l,r,x); else UpdateR(1,0,n-1,l,r,x); } for(int i=0;i<n;i++){ pii q=Query(1,0,n-1,i); finalHeight[i]=q.fi; } return; } /* 10 6 1 1 8 4 2 4 9 1 2 3 6 5 1 0 5 3 1 2 2 5 2 6 7 0 */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...