Submission #138835

#TimeUsernameProblemLanguageResultExecution timeMemory
138835Runtime_error_Wall (IOI14_wall)C++14
100 / 100
1547 ms69636 KiB

#include "wall.h"
#include <bits/stdc++.h>
#define le node+node
#define ri node+node+1
#define mid (l+r)/2
#define ll long long
using namespace std;
const int inf = 2e6+9,MX = 1e9+9;
int opmin[inf<<2],opmax[inf<<2];

void build(int node,int l,int r){

    opmin[node] = MX;
    opmax[node] = 0;
    if(l == r)
        return;
    build(le,l,mid);
    build(ri,mid+1,r);
}

void tochild(int child,int node){
    opmin[child] = min( opmin[child] , opmin[node] );//If you lower to height h on the child and to
    //height h' on the parent after that, only min(h,h') will take effect

    opmax[child] = max( opmax[child] , opmax[node] );//If you increase to height h on the child and then increase to
    //height h' on the parent, only max(h,h') will take effect

    opmin[child] = max( opmin[child] , opmax[node] );//If you decrease to height h on the child and then increase to
     //height h' on the parent, with h'>h, then the first operation will lose effect
    opmax[child] = min( opmax[child] , opmin[node] );//If you increase to height h on the child and then decrease to
    // height h' on the parent, with h'<h, then the first operation will lose effect.

}

void push(int node,int l,int r){

    if(l == r)
        return ;

    tochild(le,node);
    tochild(ri,node);
    opmax[node] = 0;
    opmin[node] = MX;
}

void update(int node,int l,int r,int x,int y,int val,int type){//type 2 minimize 1 maximize

    push(node,l,r);
    if(l>r || r<x || l>y)
        return ;
    if(l>=x && r<=y){
        if(type == 2)
            opmin[node] = min(opmin[node],val),opmax[node] = min(opmax[node],val);
        else
            opmax[node] = max(opmax[node],val) , opmin[node] = max(opmin[node],val);
        push(node,l,r);
        return ;
    }
    update(le,l,mid,x,y,val,type);
    update(ri,mid+1,r,x,y,val,type);
}

int query(int node,int l,int r,int idx){
    push(node,l,r);
    if(l == r)
        return min(opmin[node],opmax[node]);
    if(idx <= mid)
        return query(le,l,mid,idx);
    return query(ri,mid+1,r,idx);
}

void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[]){

    build(1,1,n);
    for(int i=0;i<k;i++)
        update(1,1,n,left[i]+1,right[i]+1,height[i],op[i]);
    for(int i=1;i<=n;i++)
        finalHeight[i-1] = query(1,1,n,i);
}

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