Submission #50237

#TimeUsernameProblemLanguageResultExecution timeMemory
50237mirbek01Wall (IOI14_wall)C++17
32 / 100
849 ms18972 KiB
#include "wall.h"

# include <bits/stdc++.h>

using namespace std;

const int N = 1e5 + 2;

struct st{
      int mx, mn, x, c, b, y;
      st(){
            mx = x = b = 0;
            mn = y = 1e5 + 1;
      }
}t[N * 4];

int n;

void push(int v, int tl, int tr){
      if(t[v].b){
            t[v].mx = max(t[v].mx, t[v].x);
            if(tl != tr){
                  t[v << 1].b = t[(v << 1) | 1].b = 1;
                  t[v << 1].x = max(t[v << 1].x, t[v].x);
                  t[(v << 1) | 1].x = max(t[(v << 1) | 1].x, t[v].x);
            }
            t[v].b = 0;
      }
      if(t[v].c){
            t[v].mn = min(t[v].mn, t[v].y);
            if(tl != tr){
                  t[v << 1].c = t[(v << 1) | 1].c = 1;
                  t[v << 1].y = min(t[v << 1].y, t[v].y);
                  t[(v << 1) | 1].y = min(t[(v << 1) | 1].y, t[v].y);
            }
            t[v].c = 0;
      }
}

void update(int l, int r, int x, int tp, int v = 1, int tl = 1, int tr = n){
      push(v, tl, tr);
      if(tl > r || l > tr) return ;
      if(l <= tl && tr <= r){
            if(tp == 1){
                  t[v].x = x;
                  t[v].b = 1;
            } else {
                  t[v].y = x;
                  t[v].c = 1;
            }
            push(v, tl, tr);
            return ;
      }
      int tm = (tl + tr) >> 1;
      update(l, r, x, tp, v << 1, tl, tm);
      update(l, r, x, tp, (v << 1) | 1, tm + 1, tr);
}

int get(int pos, int v = 1, int tl = 1, int tr = n){
      push(v, tl, tr);
      if(tl == tr){
            return min(t[v].mn, t[v].mx);
      }
      int tm = (tl + tr) >> 1;
      if(pos <= tm)
            return get(pos, v << 1, tl, tm);
      return get(pos, (v << 1) | 1, tm + 1, tr);
}

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

      if(n <= 10000 && k <= 5000){
            for(int i = 0; i < k; i ++){
                  for(int j = left[i]; j <= right[i]; j ++){
                        if(op[i] == 1){
                              finalHeight[j] = max(finalHeight[j], height[i]);
                        } else {
                              finalHeight[j] = min(finalHeight[j], height[i]);
                        }
                  }
            }
      } else {
            for(int i = 0; i < k; i ++){
                  update(left[i] + 1, right[i] + 1, height[i], op[i]);
            }
            for(int i = 0; i < n; i ++){
                  finalHeight[i] = get(i + 1);
            }
      }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...