Submission #282468

#TimeUsernameProblemLanguageResultExecution timeMemory
282468SaboonWall (IOI14_wall)C++14
100 / 100
991 ms100984 KiB
#include "wall.h"
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e6 + 10;

int segmx[4*maxn], segmn[4*maxn], seglz[4*maxn];

void shift(int id){
	if (seglz[id] == -1)
		return;
	segmn[2*id+0] = segmx[2*id+0] = seglz[2*id+0] = seglz[id];
	segmn[2*id+1] = segmx[2*id+1] = seglz[2*id+1] = seglz[id];
	seglz[id] = -1;
}

int get(int id, int L, int R, int idx){
	if (L + 1 == R)
		return segmn[id];
	shift(id);
	int mid = (L + R) >> 1;
	if (idx < mid)
		return get(2*id+0, L, mid, idx);
	return get(2*id+1, mid, R, idx);
}

void add(int id, int L, int R, int l, int r, int x){
	if (r <= L or R <= l or segmn[id] >= x)
		return;
	if (l <= L and R <= r and segmx[id] <= x){
		segmn[id] = segmx[id] = seglz[id] = x;
		return;
	}
	shift(id);
	int mid = (L + R) >> 1;
	add(2*id+0, L, mid, l, r, x);
	add(2*id+1, mid, R, l, r, x);
	segmx[id] = max(segmx[2*id+0], segmx[2*id+1]);
	segmn[id] = min(segmn[2*id+0], segmn[2*id+1]);
}

void del(int id, int L, int R, int l, int r, int x){
	if (r <= L or R <= l or segmx[id] <= x)
		return;
	if (l <= L and R <= r and segmn[id] >= x){
		segmn[id] = segmx[id] = seglz[id] = x;
		return;
	}
	shift(id);
	int mid = (L + R) >> 1;
	del(2*id+0, L, mid, l, r, x);
	del(2*id+1, mid, R, l, r, x);
	segmx[id] = max(segmx[2*id+0], segmx[2*id+1]);
	segmn[id] = min(segmn[2*id+0], segmn[2*id+1]);
}

void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[]){
	memset(seglz, -1, sizeof seglz);
	for (int i = 0; i < k; i++){
		if (op[i] == 1)
			add(1, 0, n, left[i], right[i]+1, height[i]);
		else
			del(1, 0, n, left[i], right[i]+1, height[i]);
	}
	for (int i = 0; i < n; i++)
		finalHeight[i] = get(1, 0, n, 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...