Submission #1161602

#TimeUsernameProblemLanguageResultExecution timeMemory
1161602I_FloPPed21Wall (IOI14_wall)C++20
0 / 100
103 ms8264 KiB
#include <iostream>
#include "wall.h"
using namespace std;
const int N=2e6+5;
struct seg
{
    int val_min,val_max;
}aint[4*N];
void aplica(int nod,seg x)
{
    aint[nod].val_min=max(aint[nod].val_min,x.val_min);
    aint[nod].val_max=max(aint[nod].val_max,aint[nod].val_min);
    aint[nod].val_max=min(aint[nod].val_max,x.val_max);
    aint[nod].val_min=min(aint[nod].val_min,aint[nod].val_max);
}
void propaga(int nod)
{
    aplica(nod*2,aint[nod]);
    aplica(nod*2+1,aint[nod]);
    aint[nod].val_min=0;
    aint[nod].val_max=1e9+2;
}
void update(int nod,int st,int dr ,int l ,int r,seg x)
{
    if(l<=st&&dr<=r)
    {
        aplica(nod,x);
    }
    else
        if(l>dr||st>r)
        return ;
    else
    {
        int mij=(st+dr)/2;
        propaga(nod);
        update(nod*2,st,mij,l,r,x);
        update(nod*2+1,mij+1,dr,l,r,x);
    }
}
seg query(int nod,int st,int dr,int poz)
{
    if(st==dr)
        return aint[nod];
    else
    {
        int mij=(st+dr)/2;
        if(poz<=mij)
            return query(nod*2,st,mij,poz);
        else
            return query(nod*2+1,mij+1,dr,poz);
    }
}
const int inf=1e9+2;
void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[]){

    for(int i=0;i<k;i++)
    {
        left[i]++;
        right[i]++;
        if(op[i]==1)
        {
            update(1,1,n,left[i],right[i],{height[i],inf});
        }
        else
        update(1,1,n,left[i],right[i],{0,height[i]});
    }

    for(int i=0;i<n;i++)
    {
        finalHeight[i]=query(1,1,n,i+1).val_min;
    }
  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...