This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include<bits/stdc++.h>
using namespace std;
#define X first
#define Y second
#define mp make_pair
#include "wall.h"
pair<int,int> lz[8000005],seg[8000005];
int ans[2000005];
pair<int,int> merge(pair<int,int> lz1,pair<int,int> lz2)
{
if(lz2.X>lz1.Y)return mp(lz2.X,lz2.X);
if(lz2.Y<lz1.X)return mp(lz2.Y,lz2.Y);
return mp(max(lz1.X,lz2.X),min(lz1.Y,lz2.Y));
}
void update(int tree,int st,int ed,int l,int r,int x,int y)
{
int md=(st+ed)/2;
if(st>=l&&ed<=r)
{
lz[tree]=merge(lz[tree],mp(x,y));
}
if(st!=ed)
{
lz[2*tree]=merge(lz[2*tree],lz[tree]);
lz[2*tree+1]=merge(lz[2*tree+1],lz[tree]);
}
seg[tree]=merge(seg[tree],lz[tree]);
lz[tree].X=0,lz[tree].Y=1e9;
if(st>r||ed<l)return;
if(st>=l&&ed<=r)return;
update(2*tree,st,md,l,r,x,y);
update(2*tree+1,md+1,ed,l,r,x,y);
}
void dfs(int tree,int st,int ed)
{
int md=(st+ed)/2;
if(st!=ed)
{
lz[2*tree]=merge(lz[2*tree],lz[tree]);
lz[2*tree+1]=merge(lz[2*tree+1],lz[tree]);
}
seg[tree]=merge(seg[tree],lz[tree]);
lz[tree].X=0,lz[tree].Y=1e9;
if(st==ed)
{
ans[st]=seg[tree].X;
return;
}
dfs(2*tree,st,md);
dfs(2*tree+1,md+1,ed);
}
void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[])
{
for(int i=0;i<=2000000;i++)lz[i].X=0,lz[i].Y=1e9,seg[i].X=0,seg[i].Y=0;
for(int i=0;i<k;i++)
{
left[i]+=1,right[i]+=1;
if(op[i]==1)
{
update(1,1,n,left[i],right[i],height[i],1e9);
}else
{
update(1,1,n,left[i],right[i],0,height[i]);
}
}
dfs(1,1,n);
for(int i=0;i<n;i++)finalHeight[i]=ans[i+1];
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |