Submission #1222440

#TimeUsernameProblemLanguageResultExecution timeMemory
1222440Octa_pe_infoWall (IOI14_wall)C++20
0 / 100
107 ms8008 KiB
#include <iostream>
#include <bits/stdc++.h>
#include "wall.h"
using namespace std;

struct arbore {

    bool flag;
    int mini,maxi;
    int l_mi,l_mx;
};

vector<arbore>aint;

///tip : 1=scad 2 cresc

void update(int nod,int st,int dr,int l,int r,int tip,int v) {

    if(l <= st && dr <= r) {

        ///cazuri
        if(tip == 1) {

            aint[nod] = {true,min(aint[nod].mini,v),min(aint[nod].maxi,v),min(aint[nod].l_mx,v),min(aint[nod].l_mi,v)};
        }

        if(tip == 2) {

            aint[nod] = {true,max(aint[nod].mini,v),max(aint[nod].maxi,v),max(aint[nod].l_mx,v),max(aint[nod].l_mi,v)};
        }
        return;
    }

    ///push
    if(aint[nod].flag) {

        aint[2*nod] = {true,max(aint[nod].l_mi,aint[2*nod].mini),min(aint[nod].l_mx,aint[2*nod].maxi),max(aint[nod].l_mi,aint[2*nod].l_mi),min(aint[nod].l_mx,aint[2*nod].l_mx)};
        aint[2*nod + 1] = {true,max(aint[nod].l_mi,aint[2*nod + 1].mini),min(aint[nod].l_mx,aint[2*nod + 1].maxi),max(aint[nod].l_mi,aint[2*nod + 1].l_mi),min(aint[nod].l_mx,aint[2*nod + 1].l_mx)};

        aint[nod].flag = false;
        aint[nod].l_mi = 0;
        aint[nod].l_mx = 1e9;
    }

    int md = (st+dr)/2;

    if(l <= md)
        update(2*nod,st,md,l,r,tip,v);

    if(r > md)
        update(2*nod + 1,md+1,dr,l,r,tip,v);

    aint[nod] = {false,max(aint[2*nod].mini,aint[2*nod + 1].mini),min(aint[2*nod].maxi,aint[2*nod + 1].maxi),0,(int)(1e9)};
}

int qeu(int nod,int st,int dr,int poz) {


    if(aint[nod].flag) {

        aint[2*nod] = {true,max(aint[nod].l_mi,aint[2*nod].mini),min(aint[nod].l_mx,aint[2*nod].maxi),max(aint[nod].l_mi,aint[2*nod].l_mi),min(aint[nod].l_mx,aint[2*nod].l_mx)};
        aint[2*nod + 1] = {true,max(aint[nod].l_mi,aint[2*nod + 1].mini),min(aint[nod].l_mx,aint[2*nod + 1].maxi),max(aint[nod].l_mi,aint[2*nod + 1].l_mi),min(aint[nod].l_mx,aint[2*nod + 1].l_mx)};

        aint[nod].flag = false;
        aint[nod].l_mi = 0;
        aint[nod].l_mx = 1e9;
    }

    if(st==dr)
        return aint[nod].mini;

    int md = (st+dr)/2;

    if(poz <= md)
        return qeu(2*nod,st,md,poz);
    else
        return qeu(2*nod + 1,md+1,dr,poz);
}

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

    const int INF = 1000000000;

    aint.assign(4*n, {false, 0, 0, 0, INF});

    for (int i = 0; i < k; i++) {

        int tip = (op[i] == 1 ? 2 : 1);
        update(1, 0, n-1, left[i], right[i], tip, height[i]);
    }

    for (int j = 0; j < n; j++) {
        finalHeight[j] = qeu(1, 0, n-1, j);
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...