Submission #425303

#TimeUsernameProblemLanguageResultExecution timeMemory
425303MarcoMeijerWall (IOI14_wall)C++14
100 / 100
1495 ms69604 KiB
#include "wall.h"
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef pair<int, int> ii;
typedef vector<ll> vll;
typedef vector<int> vi;
typedef vector<ii> vii;

#define REP(a,b,c) for(int a=int(b); a<int(c); a++)
#define REV(a,b,c) for(int a=int(c-1); a>=int(b); a--)
#define RE(a,b) REP(a,0,b)
#define RE1(a,b) REP(a,1,b+1)
#define FOR(a,b) for(auto& a : b)
#define pb push_back
#define fi first
#define se second
#define all(a) a.begin(), e.end()

const int MX = 1e5;
const int N = (1<<21);

int seglb[N*2], segub[N*2];
void buildSeg(int p=1, int l=0, int r=N-1) {
  seglb[p] = 0;
  segub[p] = 0;
  if(l == r) return;
  int m=(l+r)/2;
  buildSeg(p*2,l,m);
  buildSeg(p*2+1,m+1,r);
}
void applyRegion(int p, int lb, int ub) {
  seglb[p] = min(seglb[p], ub);
  segub[p] = min(segub[p], ub);
  seglb[p] = max(seglb[p], lb);
  segub[p] = max(segub[p], lb);
}
void pushSeg(int p) {
  applyRegion(p*2,seglb[p],segub[p]);
  applyRegion(p*2+1,seglb[p],segub[p]);
  seglb[p] = 0;
  segub[p] = 1e9;
}
void addSeg(int i, int j, int lb, int ub, int p=1, int l=0, int r=N-1) {
  if(j < l || i > r) return;
  if(i <= l && j >= r) {
    applyRegion(p,lb,ub);
    return;
  }
  pushSeg(p);
  int m=(l+r)/2;
  addSeg(i,j,lb,ub,p*2,l,m);
  addSeg(i,j,lb,ub,p*2+1,m+1,r);
}
int getSeg(int i, int p=1, int l=0, int r=N-1) {
  if(i < l || i > r) return 0;
  if(l == r) return seglb[p];
  pushSeg(p);
  int m=(l+r)/2;
  int a=getSeg(i,p*2,l,m);
  int b=getSeg(i,p*2+1,m+1,r);
  return a+b;
}

void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[]){
  buildSeg();
  RE(i,k) {
    if(op[i] == 1) {
      addSeg(left[i], right[i], height[i], 1e9);
    } else {
      addSeg(left[i], right[i], 0, height[i]);
    }
  }
  RE(i,n) finalHeight[i] = getSeg(i);
}

#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...