Submission #430788

#TimeUsernameProblemLanguageResultExecution timeMemory
430788TLP39Wall (IOI14_wall)C++14
100 / 100
835 ms85636 KiB
#include "wall.h"
#include <bits/stdc++.h>
using namespace std;

const int INF=1000000000;

struct func{
    int l,r;
};

func compose(func f,func g)
{
    if(f.r<=g.l) return {g.l,g.l};
    if(f.l>=g.r) return {g.r,g.r};
    return {max(f.l,g.l),min(f.r,g.r)};
}

int n,k;

func seg[8000010];
bool marked[8000010],bottom[8000010];
int pos[2000010];

void build(int v,int st,int ed)
{
    marked[v]=false;
    bottom[v]=false;
    seg[v]={-INF,INF};
    if(st==ed)
    {
        pos[st]=v;
        bottom[v]=true;
        return;
    }
    int mid=(st+ed)>>1;
    build(v<<1,st,mid);
    build(1+(v<<1),mid+1,ed);
}

void push_down(int v)
{
    if(!marked[v] || bottom[v]) return;
    marked[v]=false;
    marked[v<<1]=marked[1+(v<<1)]=true;
    seg[v<<1]=compose(seg[v<<1],seg[v]);
    seg[1+(v<<1)]=compose(seg[1+(v<<1)],seg[v]);
    seg[v]={-INF,INF};
}

void upd(int v,int l,int r,int st,int ed,func f)
{
    if(st>ed) return;
    if(l==st && r==ed)
    {
        marked[v]=true;
        seg[v]=compose(seg[v],f);
        return;
    }
    push_down(v);
    int mid=(l+r)>>1;
    upd(v<<1,l,mid,st,min(mid,ed),f);
    upd(1+(v<<1),mid+1,r,max(mid+1,st),ed,f);
}

int que(int x)
{
    int ver=pos[x],res=0;
    while(ver)
    {
        if(res<=seg[ver].l) res=seg[ver].l;
        else if(res>=seg[ver].r) res=seg[ver].r;
        ver>>=1;
    }
    return res;
}

void buildWall(int N, int K, int op[], int left[], int right[], int height[], int finalHeight[]){
  n=N;
  k=K;
  build(1,0,n-1);
  for(int i=0;i<k;i++)
  {
    if(op[i]==1)
    {
        upd(1,0,n-1,left[i],right[i],{height[i],INF});
    }
    else
    {
        upd(1,0,n-1,left[i],right[i],{-INF,height[i]});
    }
  }
  for(int i=0;i<n;i++) finalHeight[i]=que(i);
  return;
}

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