Submission #130872

#TimeUsernameProblemLanguageResultExecution timeMemory
130872MAMBAWall (IOI14_wall)C++14
100 / 100
767 ms92360 KiB
#include "wall.h"
#include <bits/stdc++.h>

using namespace std;

#define rep(i , j , k) for (int i = j; i < (int) k; i++)
#define lid id<<1
#define rid lid|1

const int N = 2e6 + 10;

int n2;	

int segMin[N << 2];
int segMax[N << 2];

inline int smin(int &a, int b) { return b < a ? a = b : a; }
inline int smax(int &a, int b) { return a < b ? a = b : a; }

inline void applyMax(int id, int val) {
	smax(segMin[id] , val);
	smax(segMax[id] , val);
}

inline void applyMin(int id, int val) {
	smin(segMin[id] , val);
	smin(segMax[id] , val);
}

inline void shift(int id) {
	applyMin(lid , segMax[id]);
	applyMin(rid , segMax[id]);
	applyMax(lid , segMin[id]);
	applyMax(rid , segMin[id]);
	segMin[id] = 0;
	segMax[id] = 1e5;
}

void segApplyMin(int s, int t, int val , int l = 0 , int r = n2 , int id = 1) {
	if (l >= s && r <= t) {
		applyMin(id , val);
		return;
	}
	int mid = l + r >> 1;
	shift(id);
	if (s < mid) segApplyMin(s  ,t , val , l , mid , lid);
	if (t > mid) segApplyMin(s , t , val , mid , r , rid);
}

void segApplyMax(int s, int t, int val , int l = 0 , int r = n2 , int id = 1) {
	if (l >= s && r <= t) {
		applyMax(id , val);
		return;
	}
	int mid = l + r >> 1;
	shift(id);
	if (s < mid) segApplyMax(s  ,t , val , l , mid , lid);
	if (t > mid) segApplyMax(s , t , val , mid , r , rid);
}
int res[N];

void dfs(int l = 0, int r = n2, int id = 1) {
	if (l == r - 1) {
		res[l] = segMin[id];
	//	cout << l << ' '<< segMin[id] << ' '<< segMax[id] << endl;
		return;
	}
	int mid= l +r >> 1;
	shift(id);
	dfs(l , mid, lid);
	dfs(mid ,r, rid);
}


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

	n2 = n;

	fill(segMax , segMax + (N << 2) , 1e5 + 1);

	rep(i , 0 , k) 
		op[i] == 1 ? 
			segApplyMax(left[i] , right[i] + 1 , height[i]) :
			segApplyMin(left[i] , right[i] + 1 , height[i]);
//	cout << "DONE" << endl;

	dfs();

	memcpy(finalHeight , res , 4 * n2);

	return;
}

Compilation message (stderr)

wall.cpp: In function 'void segApplyMin(int, int, int, int, int, int)':
wall.cpp:44:14: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  int mid = l + r >> 1;
            ~~^~~
wall.cpp: In function 'void segApplyMax(int, int, int, int, int, int)':
wall.cpp:55:14: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  int mid = l + r >> 1;
            ~~^~~
wall.cpp: In function 'void dfs(int, int, int)':
wall.cpp:68:13: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  int mid= l +r >> 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...