Submission #1276695

#TimeUsernameProblemLanguageResultExecution timeMemory
1276695turralWall (IOI14_wall)C++17
Compilation error
0 ms0 KiB
#include "wall.h"
#include <iostream>
#include <vector>

using namespace std;

#define int long long

const int INF = 1e18;

int log2_ceil(int n){
  return 63 - __builtin_clzll(n) + (__builtin_popcount(n) != 1);
}

inline int L(int node){
  return 2*node;
}

inline int R(int node){
  return 2*node + 1;
}

struct segment_tree {
  int numElements, N;
  vector<int> stMax, stMin;
  vector<bool> lazyAdd, lazyRemove;

  segment_tree(int _numEl) : numElements(_numEl) {
    N = (1 << log2_ceil(numElements));

    stMax.assign(2*N, -INF);
    stMin.assign(2*N, INF);

    lazyAdd.assign(2*N, false);
    lazyRemove.assign(2*N, false);

    for (int i=0; i<numElements; ++i) stMax[i+N] = stMin[i+N] = 0;
    for (int i=N-1; i>=1; --i) stMin[i] = min(stMin[L(i)], stMin[R(i)]);
    for (int i=N-1; i>=1; --i) stMax[i] = max(stMax[L(i)], stMax[R(i)]);
  }

  
  void addLazyFunc(int node, int h){
    if (stMin[node] >= h) return;

    stMin[node] = h;
    lazyAdd[node] = true;

    if (stMax[node] < h){
      stMax[node] = h;
      lazyRemove[node] = true;
    }
  }

  void removeLazyFunc(int node, int h){
    if (stMax[node] <= h) return;

    stMax[node] = h;
    lazyRemove[node] = true;

    if (stMin[node] > h){
      stMin[node] = h;
      lazyAdd[node] = true;
    }
  }

  void pushAdd(int node){
    if (node < N){
      addLazyFunc(L(node), stMin[node]);
      addLazyFunc(R(node), stMin[node]);
    }

    lazyAdd[node] = false;
  }

  void pushRemove(int node){
    if (node < N){
      removeLazyFunc(L(node), stMax[node]);
      removeLazyFunc(R(node), stMax[node]);
    }

    lazyRemove[node] = false;
  }

  void push(int node){
    if (lazyAdd[node]) pushAdd(node);
    if (lazyRemove[node]) pushRemove(node);
  }

  void remove(int node, int l, int r, int a, int b, int h){
    if (b < l || r < a) return;

    if (a <= l && r <= b){
      removeLazyFunc(node, h);
      return;
    }
    
    push(node);

    int m = (l+r)/2;
    remove(L(node), l, m, a, b, h);
    remove(R(node), m+1, r, a, b, h);

    stMin[node] = min(stMin[L(node)], stMin[R(node)]);
    stMax[node] = max(stMax[L(node)], stMax[R(node)]);
  }

  void remove(int a, int b, int h){
    remove(1, 0, N-1, a, b, h);
  }

  void add(int node, int l, int r, int a, int b, int h){
    if (b < l || r < a) return;

    if (a <= l && r <= b){
      addLazyFunc(node, h);
      return;
    }
    
    push(node);

    int m = (l+r)/2;
    add(L(node), l, m, a, b, h);
    add(R(node), m+1, r, a, b, h);

    stMin[node] = min(stMin[L(node)], stMin[R(node)]);
    stMax[node] = max(stMax[L(node)], stMax[R(node)]);
  }

  void add(int a, int b, int h){
    add(1, 0, N-1, a, b, h);
  }

  vector<int> getState(){
    vector<int> res(numElements);

    for (int i=1; i<N; ++i) push(i);
    for (int i=0; i<numElements; ++i) res[i] = stMin[i+N]; 

    return res;
  }
};

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

  for (int i=0; i<k; ++i){
    if (op[i] == 1){
      ST.add(left[i], right[i], height[i]);
    } else {
      ST.remove(left[i], right[i], height[i]);
    }
  }

  vector<int> res = ST.getState();
  for (int i=0; i<n; ++i){
    finalHeight[i] = res[i];
  } 
  return;
}

Compilation message (stderr)

wall.cpp: In function 'void buildWall(long long int, long long int, long long int**, long long int**, long long int**, long long int**, long long int**)':
wall.cpp:148:15: error: ISO C++ forbids comparison between pointer and integer [-fpermissive]
  148 |     if (op[i] == 1){
      |         ~~~~~~^~~~
wall.cpp:149:20: error: invalid conversion from 'long long int*' to 'long long int' [-fpermissive]
  149 |       ST.add(left[i], right[i], height[i]);
      |              ~~~~~~^
      |                    |
      |                    long long int*
wall.cpp:130:16: note:   initializing argument 1 of 'void segment_tree::add(long long int, long long int, long long int)'
  130 |   void add(int a, int b, int h){
      |                ^
wall.cpp:149:30: error: invalid conversion from 'long long int*' to 'long long int' [-fpermissive]
  149 |       ST.add(left[i], right[i], height[i]);
      |                       ~~~~~~~^
      |                              |
      |                              long long int*
wall.cpp:130:23: note:   initializing argument 2 of 'void segment_tree::add(long long int, long long int, long long int)'
  130 |   void add(int a, int b, int h){
      |                       ^
wall.cpp:149:41: error: invalid conversion from 'long long int*' to 'long long int' [-fpermissive]
  149 |       ST.add(left[i], right[i], height[i]);
      |                                 ~~~~~~~~^
      |                                         |
      |                                         long long int*
wall.cpp:130:30: note:   initializing argument 3 of 'void segment_tree::add(long long int, long long int, long long int)'
  130 |   void add(int a, int b, int h){
      |                              ^
wall.cpp:151:23: error: invalid conversion from 'long long int*' to 'long long int' [-fpermissive]
  151 |       ST.remove(left[i], right[i], height[i]);
      |                 ~~~~~~^
      |                       |
      |                       long long int*
wall.cpp:108:19: note:   initializing argument 1 of 'void segment_tree::remove(long long int, long long int, long long int)'
  108 |   void remove(int a, int b, int h){
      |                   ^
wall.cpp:151:33: error: invalid conversion from 'long long int*' to 'long long int' [-fpermissive]
  151 |       ST.remove(left[i], right[i], height[i]);
      |                          ~~~~~~~^
      |                                 |
      |                                 long long int*
wall.cpp:108:26: note:   initializing argument 2 of 'void segment_tree::remove(long long int, long long int, long long int)'
  108 |   void remove(int a, int b, int h){
      |                          ^
wall.cpp:151:44: error: invalid conversion from 'long long int*' to 'long long int' [-fpermissive]
  151 |       ST.remove(left[i], right[i], height[i]);
      |                                    ~~~~~~~~^
      |                                            |
      |                                            long long int*
wall.cpp:108:33: note:   initializing argument 3 of 'void segment_tree::remove(long long int, long long int, long long int)'
  108 |   void remove(int a, int b, int h){
      |                                 ^
wall.cpp:157:27: error: invalid conversion from '__gnu_cxx::__alloc_traits<std::allocator<long long int>, long long int>::value_type' {aka 'long long int'} to 'long long int*' [-fpermissive]
  157 |     finalHeight[i] = res[i];
      |                           ^
      |                           |
      |                           __gnu_cxx::__alloc_traits<std::allocator<long long int>, long long int>::value_type {aka long long int}