Submission #385405

#TimeUsernameProblemLanguageResultExecution timeMemory
385405alishahali1382Wall (IOI14_wall)C++14
100 / 100
787 ms97772 KiB
#include "wall.h"
#include <bits/stdc++.h>

using namespace std;

typedef pair<int, int> pii;
#define debugp(p) {cerr<<#p<<"={"<<p.first<<", "<<p.second<<"}\n";}

const int inf=1000000100;
const int MAXN=2000010;

int A[MAXN];
pii seg[MAXN<<2];

pii Merge(pii a, pii b){
	if (a.second<b.first) return {b.first, b.first};
	if (b.second<a.first) return {b.second, b.second};
	return {max(a.first, b.first), min(a.second, b.second)};
}
void shift(int id){
	seg[id<<1]=Merge(seg[id<<1], seg[id]);
	seg[id<<1 | 1]=Merge(seg[id<<1 | 1], seg[id]);
	seg[id]=seg[0];
}
void Put(int id, int tl, int tr, int l, int r, pii p){
	if (r<=tl || tr<=l) return ;
	if (l<=tl && tr<=r){
		seg[id]=Merge(seg[id], p);
		// debugp(seg[id])
		return ;
	}
	shift(id);
	int mid=(tl+tr)>>1;
	Put(id<<1, tl, mid, l, r, p);
	Put(id<<1 | 1, mid, tr, l, r, p);
}
void dfs(int id, int tl, int tr){
	if (tr-tl==1){
		A[tl]=Merge({0, 0}, seg[id]).first;
		return ;
	}
	shift(id);
	int mid=(tl+tr)>>1;
	dfs(id<<1, tl, mid);
	dfs(id<<1 | 1, mid, tr);
}

void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[]){
	fill(seg, seg+MAXN*4, pii(0, inf));
	for (int i=0; i<k; i++){
		int l=left[i], r=right[i]+1, h=height[i];
		if (op[i]==1) Put(1, 0, n, l, r, {h, inf});
		if (op[i]==2) Put(1, 0, n, l, r, {0, h});
	}
	dfs(1, 0, n);
	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...