Submission #710223

#TimeUsernameProblemLanguageResultExecution timeMemory
710223JJAnawatWall (IOI14_wall)C++14
100 / 100
988 ms102440 KiB
#include "wall.h"
#include<bits/stdc++.h>

using namespace std;

const int inf=1e9;

struct node{
    int mn,mx;

    node(int mnn=-inf,int mxx=inf){
        mn=mnn;
        mx=mxx;
    }
};

node seg[(1<<22)];
node lz[(1<<22)];

void add(int i,int k){
    seg[i].mn=max(seg[i].mn,k);
    seg[i].mx=max(seg[i].mx,k);
    lz[i].mn=max(lz[i].mn,k);
    lz[i].mx=max(lz[i].mx,k);
}

void rem(int i,int k){
    seg[i].mn=min(seg[i].mn,k);
    seg[i].mx=min(seg[i].mx,k);
    lz[i].mn=min(lz[i].mn,k);
    lz[i].mx=min(lz[i].mx,k);
}

void push(int i){
    if(lz[i].mn!=-inf){
        add(2*i,lz[i].mn);
        add(2*i+1,lz[i].mn);
    }
    if(lz[i].mx!=inf){
        rem(2*i,lz[i].mx);
        rem(2*i+1,lz[i].mx);
    }
    lz[i]=node();
}

void upd(int l,int r,int i,int x,int y,int v,int op){
    if(l>y||r<x)
        return;
    if(l>=x&&r<=y){
        if(op==1)
            add(i,v);
        else
            rem(i,v);
        return;
    }
    push(i);
    int m=(l+r)/2;
    upd(l,m,2*i,x,y,v,op);
    upd(m+1,r,2*i+1,x,y,v,op);
    seg[i].mn=min(seg[2*i].mn,seg[2*i+1].mn);
    seg[i].mx=max(seg[2*i+1].mx,seg[2*i+1].mx);
}

int qr(int l,int r,int i,int x){
    if(l==r)
        return seg[i].mn;
    int m=(l+r)/2;
    push(i);
    if(x<=m)
        return qr(l,m,2*i,x);
    else
        return qr(m+1,r,2*i+1,x);
}

void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[]){
    for(int i=0;i<(1<<22);i++)
        seg[i]=node(0,0);
    for(int i=0;i<k;i++)
        upd(0,n-1,1,left[i],right[i],height[i],op[i]);
    for(int i=0;i<n;i++)
        finalHeight[i]=qr(0,n-1,1,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...