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;
//printf("st=%d md=%d ed=%d\n",st,md,ed);
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]);
}
//printf("before=%d %d\n",seg[tree].X,seg[tree].Y);
seg[tree]=merge(seg[tree],lz[tree]);
//printf("after=%d %d\n",seg[tree].X,seg[tree].Y);
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);
seg[tree].X=min(seg[2*tree].X,seg[2*tree+1].X);
seg[tree].Y=max(seg[2*tree].Y,seg[2*tree+1].Y);
}
pair<int,int> query(int tree,int st,int ed,int l,int r)
{
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>r||ed<l)return mp(0,1e9);
if(st>=l&&ed<=r)return seg[tree];
pair<int,int> pi1,pi2;
pi1=query(2*tree,st,md,l,r);
pi2=query(2*tree+1,md+1,ed,l,r);
return mp(max(pi1.X,pi2.X),min(pi1.Y,pi2.Y));
}
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;
//printf("left=%d || right=%d\n",left[i],right[i]);
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]);
}
for(int j=1;j<=n;j++)
{
ans[j]=query(1,1,n,j,j).X;
//printf("ans[%d]=%d\n",j,ans[j]);
}
}
for(int i=1;i<=n;i++)
{
ans[i]=query(1,1,n,i,i).X;
//printf("ans[%d]=%d\n",i,ans[i]);
}
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... |