Submission #1203332

#TimeUsernameProblemLanguageResultExecution timeMemory
1203332inesfi벽 (IOI14_wall)C++20
24 / 100
149 ms11352 KiB
#include "wall.h"
#include<bits/stdc++.h>
using namespace std;

#define ll long long

const int DECA=(1<<17);
int arbremax[2*DECA],arbremin[2*DECA];

void remontemax(int a,int b,int val){
    if (a==b){
        arbremax[a]=max(arbremax[a],val);
        return ;
    }
    if (a%2==1){
        arbremax[a]=max(arbremax[a],val);
        remontemax(a+1,b,val);
        return ;
    }
    if (b%2==0){
        arbremax[b]=max(arbremax[b],val);
        remontemax(a,b-1,val);
        return ;
    }
    remontemax(a/2,b/2,val);
}

void remontemin(int a,int b,int val){
    if (a==b){
        arbremin[a]=min(arbremin[a],val);
        return ;
    }
    if (a%2==1){
        arbremin[a]=min(arbremin[a],val);
        remontemin(a+1,b,val);
        return ;
    }
    if (b%2==0){
        arbremin[b]=min(arbremin[b],val);
        remontemin(a,b-1,val);
        return ;
    }
    remontemin(a/2,b/2,val);
}

void buildWall(int nbcol,int nbchangements, int op[], int gauche[], int droite[], int hauteur[], int rep[]){
    int ec=0;
    while (op[ec]==1){
        remontemax(gauche[ec]+DECA,droite[ec]+DECA,hauteur[ec]);
        ec++;
    }
    for (int i=0;i<DECA*2;i++){
        arbremin[i]=1000*1000*1000;
    }
    for (int i=ec;i<nbchangements;i++){
        remontemin(gauche[i]+DECA,droite[i]+DECA,hauteur[i]);
    }
    for (int i=1;i<2*DECA;i++){
        arbremax[i]=max(arbremax[i],arbremax[i/2]);
        arbremin[i]=min(arbremin[i],arbremin[i/2]);
    }
    for (int i=DECA;i<DECA+nbcol;i++){
        rep[i-DECA]=min(arbremax[i],arbremin[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...