Submission #567674

#TimeUsernameProblemLanguageResultExecution timeMemory
567674JesusWall (IOI14_wall)C++14
100 / 100
590 ms77536 KiB
#include "wall.h"
#include<bits/stdc++.h>

using namespace std;

int lim;

pair<int,int> st[8000001];

pair<int,int> reiniciar={0,1000000000};

void heredar(int pos){
    for(int i=pos*2;i<=pos*2+1;i++){
        st[i].second=min(st[i].second,st[pos].second);
        if(st[pos].second<=st[i].first) st[i].first=max(st[pos].second,st[pos].first);
        else st[i].first=max(st[i].first,st[pos].first);
    }
    st[pos]=reiniciar;
}

void iniciar(int i=0,int j=lim-1,int pos=1){
    if(i==j) st[pos]=reiniciar;
    else{
        iniciar(i,(i+j)/2);
        iniciar((i+j)/2+1,j);
    }
}

void st_actualizar(int tp,int alt,int izq,int der,int i=0,int j=lim-1,int pos=1){
    if(izq==i&&der==j){
            if(tp==2){
                st[pos].second=min(st[pos].second,alt);
                if(st[pos].first>0) st[pos].first=min(st[pos].first,alt);
            }
            else st[pos].first=max(st[pos].first,alt);
    }
    else{
        if(st[pos].first>0||st[pos].second<1000000000) heredar(pos);
        if(izq<=(i+j)/2) st_actualizar(tp,alt,izq,min(der,(i+j)/2),i,(i+j)/2,pos*2);
        if(der>(i+j)/2) st_actualizar(tp,alt,max(izq,(i+j)/2+1),der,(i+j)/2+1,j,pos*2+1);
    }
    return;
}

int resultado[2000000];

void revision(int i=0,int j=lim-1,int pos=1){
    if(i==j){
        resultado[i]=st[pos].first;
    }
    else{
        if(st[pos].first>0||st[pos].second<1000000000) heredar(pos);
        revision(i,(i+j)/2,pos*2);
        revision((i+j)/2+1,j,pos*2+1);
    }
    return;
}

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

    for(int i=0;i<k;i++){
        st_actualizar(op[i],height[i],left[i],right[i]);
    }

    revision();

    for(int i=0;i<n;i++){
        finalHeight[i]=resultado[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...