Submission #566014

#TimeUsernameProblemLanguageResultExecution timeMemory
566014Leo121Wall (IOI14_wall)C++14
0 / 100
270 ms13936 KiB
#include <bits/stdc++.h>
#include "wall.h"

using namespace std;

struct node {
    bool lazy;
    int alto;
    int bajo;
    bool ultimo;
};

const int maxn = 2e6;
node st[4 * maxn + 1];
int valu[maxn];

void push(int nodo, int l, int r){
    if(!st[nodo].lazy){
        return;
    }
    if(l == r){
        if(st[nodo].alto == -1){
            valu[l] = min(valu[l], st[nodo].bajo);
        }
        else if(st[nodo].bajo == -1){
            valu[l] = max(valu[l], st[nodo].alto);
        }
        else{
            if(st[nodo].ultimo){
                valu[l] = min(valu[l], st[nodo].bajo);
                valu[l] = max(valu[l], st[nodo].alto);
            }
            else{
                valu[l] = max(valu[l], st[nodo].alto);
                valu[l] = min(valu[l], st[nodo].bajo);
            }
        }
    }
    else{
        if((st[nodo].bajo != -1 && st[nodo].alto != -1 && st[nodo].ultimo) || st[nodo].alto == -1){
            if(!st[nodo * 2].lazy){
                st[nodo * 2] = {1, -1, st[nodo].bajo, 0};
            }
            else{
                if(st[nodo * 2].bajo > st[nodo].bajo || st[nodo * 2].alto > st[nodo].bajo || st[nodo * 2].bajo == -1){
                    st[nodo * 2].ultimo = 0;
                    st[nodo * 2].bajo = st[nodo].bajo;
                }
            }
            if(!st[nodo * 2 + 1].lazy){
                st[nodo * 2 + 1] = {1, -1, st[nodo].bajo, 0};
            }
            else{
                if(st[nodo * 2 + 1].bajo > st[nodo].bajo || st[nodo * 2 + 1].alto > st[nodo].bajo || st[nodo * 2 + 1].bajo == -1){
                    st[nodo * 2 + 1].ultimo = 0;
                    st[nodo * 2 + 1].bajo = st[nodo].bajo;
                }
            }
            if(st[nodo].alto != -1){
                if(st[nodo * 2].alto < st[nodo].alto || st[nodo * 2].bajo > st[nodo].alto || st[nodo * 2].alto == -1){
                    st[nodo * 2].ultimo = 1;
                    st[nodo * 2].alto = st[nodo].alto;
                }
                if(st[nodo * 2 + 1].alto < st[nodo].alto || st[nodo * 2 + 1].bajo > st[nodo].alto || st[nodo * 2 + 1].alto == -1){
                    st[nodo * 2 + 1].ultimo = 1;
                    st[nodo * 2 + 1].alto = st[nodo].alto;
                }
            }
        }
        else{
            if(!st[nodo * 2].lazy){
                st[nodo * 2] = {1, st[nodo].alto, -1, 1};
            }
            else{
                if(st[nodo * 2].alto < st[nodo].alto || st[nodo * 2].bajo > st[nodo].alto || st[nodo * 2].alto == -1){
                    st[nodo * 2].ultimo = 1;
                    st[nodo * 2].alto = st[nodo].alto;
                }
            }
            if(!st[nodo * 2 + 1].lazy){
                st[nodo * 2 + 1] = {1, st[nodo].alto, -1, 1};
            }
            else{
                if(st[nodo * 2 + 1].alto < st[nodo].alto || st[nodo * 2 + 1].bajo > st[nodo].alto || st[nodo * 2 + 1].alto == -1){
                    st[nodo * 2 + 1].ultimo = 1;
                    st[nodo * 2 + 1].alto = st[nodo].alto;
                }
            }
            if(st[nodo].bajo != -1){
                if(st[nodo * 2].bajo > st[nodo].bajo || st[nodo * 2].alto > st[nodo].bajo || st[nodo * 2].bajo == -1){
                    st[nodo * 2].ultimo = 0;
                    st[nodo * 2].bajo = st[nodo].bajo;
                }
                if(st[nodo * 2 + 1].bajo > st[nodo].bajo || st[nodo * 2 + 1].alto > st[nodo].bajo || st[nodo * 2 + 1].bajo == -1){
                    st[nodo * 2 + 1].ultimo = 0;
                    st[nodo * 2 + 1].bajo = st[nodo].bajo;
                }
            }
        }
    }
    st[nodo] = {0, -1, -1, 0};
}

void built(int nodo, int l, int r){
    st[nodo] = {0, -1, -1, 0};
    if(l == r){
        return;
    }
    int mitad = (l + r) / 2;
    built(nodo * 2, l, mitad);
    built(nodo * 2 + 1, mitad + 1, r);
}

void update(int nodo, int l, int r, int a, int b, bool tipo, int val){
    push(nodo, l, r);
    if(r < a || l > b){
        return;
    }
    if(l >= a && r <= b){
        if(tipo){
            if(l == r){
                valu[l] = max(valu[l], val);
                return;
            }
            if(!st[nodo * 2].lazy){
                st[nodo * 2] = {1, val, -1, 1};
            }
            else{
                if(st[nodo * 2].alto < val || st[nodo * 2].bajo > val || st[nodo * 2].alto == -1){
                    st[nodo * 2].ultimo = 1;
                    st[nodo * 2].alto = val;
                }
            }
            if(!st[nodo * 2 + 1].lazy){
                st[nodo * 2 + 1] = {1, val, -1, 1};
            }
            else{
                if(st[nodo * 2 + 1].alto < val || st[nodo * 2 + 1].bajo > val || st[nodo * 2 + 1].alto == -1){
                    st[nodo * 2 + 1].ultimo = 1;
                    st[nodo * 2 + 1].alto = val;
                }
            }
            return;
        }
        else{
            if(l == r){
                valu[l] = min(valu[l], val);
                return;
            }
            if(!st[nodo * 2].lazy){
                st[nodo * 2] = {1, -1, val, 0};
            }
            else{
                if(st[nodo * 2].bajo > val || st[nodo * 2].alto > val || st[nodo * 2].bajo == -1){
                    st[nodo * 2].ultimo = 0;
                    st[nodo * 2].bajo = val;
                }
            }
            if(!st[nodo * 2 + 1].lazy){
                st[nodo * 2 + 1] = {1, -1, val, 0};
            }
            else{
                if(st[nodo * 2 + 1].bajo > val || st[nodo * 2 + 1].alto > val || st[nodo * 2 + 1].bajo == -1){
                    st[nodo * 2 + 1].ultimo = 0;
                    st[nodo * 2 + 1].bajo = val;
                }
            }
            return;
        }
    }
    int mitad = (l + r) / 2;
    update(nodo * 2, l, mitad, a, b, tipo, val);
    update(nodo * 2 + 1, mitad + 1, r, a, b, tipo, val);
}

void query(int nodo, int l, int r){
    push(nodo, l, r);
    if(l == r){
        return;
    }
    int mitad = (l + r) / 2;
    query(nodo * 2, l, mitad);
    query(nodo * 2 + 1, mitad + 1, r);
}

void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[]){
    built(1, 0, n - 1);
    for(int i = 0; i < k; ++ i){
        bool opcion = (op[i] == 1);
        update(1, 0, n - 1, left[i], right[i], opcion, height[i]);
    }
    query(1, 0, n - 1);
    for(int i = 0; i < n; ++ i){
        finalHeight[i] = valu[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...