Submission #779239

#TimeUsernameProblemLanguageResultExecution timeMemory
779239Sohsoh84Wall (IOI14_wall)C++17
100 / 100
613 ms101072 KiB
#include "wall.h"
#include <bits/stdc++.h>

using namespace std;

typedef pair<int, int> pll;

#define X		first
#define Y		second

const int MAXN = 1e7 + 10;

pll sg[MAXN];
int n, lz[MAXN], A[MAXN];

inline pll merge(pll a, pll b) {
	a.X = min(a.X, b.X);
	a.Y = max(a.Y, b.Y);
	return a;
}

void build(int l = 0, int r = n - 1, int v = 1) {
	lz[v] = -1;
	if (l == r) sg[v] = {0, 0};
	else {
		int mid = (l + r) >> 1;
		build(l, mid, v << 1);
		build(mid + 1, r, v << 1 | 1);
		sg[v] = merge(sg[v << 1], sg[v << 1 | 1]);
	}
}

inline void push(int v) {
	if (lz[v] >= 0) {
		sg[v] = {lz[v], lz[v]};
		if ((v << 1 | 1) < MAXN) lz[v << 1] = lz[v << 1 | 1] = lz[v];
	}

	lz[v] = -1;
}

void q_max(int ql, int qr, int val, int l = 0, int r = n - 1, int v = 1) {
	push(v);
	if (ql > r || qr < l || sg[v].X >= val) return;
	if (ql <= l && qr >= r) {
		if (sg[v].Y <= val) {
			lz[v] = val;
			push(v);
			return;
		}	
	}

	int mid = (l + r) >> 1;
	q_max(ql, qr, val, l, mid, v << 1);
	q_max(ql, qr, val, mid + 1, r, v << 1 | 1);
	sg[v] = merge(sg[v << 1], sg[v << 1 | 1]);
	return;
}

void q_min(int ql, int qr, int val, int l = 0, int r = n - 1, int v = 1) {
	push(v);
	if (ql > r || qr < l || sg[v].Y <= val) return;
	if (ql <= l && qr >= r) {
		if (sg[v].X >= val) {
			lz[v] = val;
			push(v);
			return;
		}	
	}

	int mid = (l + r) >> 1;
	q_min(ql, qr, val, l, mid, v << 1);
	q_min(ql, qr, val, mid + 1, r, v << 1 | 1);
	sg[v] = merge(sg[v << 1], sg[v << 1 | 1]);
	return;
}

void print(int l = 0, int r = n - 1, int v = 1) {
	push(v);
	if (l == r) {
		A[l] = sg[v].X;
		return;
	}

	int mid = (l + r) >> 1;
	print(l, mid, v << 1);
	print(mid + 1, r, v << 1 | 1);
}

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

	for (int i = 0; i < k; i++) {
		if (op[i] == 1) q_max(left[i], right[i], height[i]);
		else q_min(left[i], right[i], height[i]);
	}

	print();
	for (int i = 0; i < n; i++) finalHeight[i] = A[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...