Submission #292821

#TimeUsernameProblemLanguageResultExecution timeMemory
292821oolimryWall (IOI14_wall)C++14
100 / 100
1061 ms232664 KiB
#include "wall.h"
#include <bits/stdc++.h>
#define all(x) (x).begin(), (x).end()
#define sz(x) (int) (x).size()
using namespace std;
typedef long long lint;
typedef pair<int,int> ii;

const int inf = 1023456789;

vector<int> ans;

struct node{
	int s, e, m;
	int low, high;
	node *l, *r;
	
	node(int S, int E){
		s = S, e = E, m = (s+e)/2;
		if(s != e){
			low = 0, high = inf;
			l = new node(s, m);
			r = new node(m+1, e);
		}
		else low = 0, high = 0;
	}
	
	void apply(int L, int H){
		if(L > high) low = high = L;
		else if(H < low) low = high = H;
		else{
			low = max(low, L);
			high = min(high, H);
		}
	}
	
	void push(){
		if(s == e) return;
		l->apply(low, high);
		r->apply(low, high);
		low = 0, high = inf;
	}
		
	void update(int S, int E, int op, int H){
		push();
		if(S == s && E == e){
			if(op == 1) apply(H, inf);
			else if(op == 2) apply(-inf, H);
			return;
		}
		else if(E <= m) l->update(S, E, op, H);
		else if(S >= m+1) r->update(S, E, op, H);
		else{
			l->update(S, m, op, H);
			r->update(m+1, E, op, H);
		}
	}
	
	void out(){
		push();
		//cout << s << " " << e << ": " << "(" << low << ", " << high << ")\n";
		if(s == e){
			ans.push_back(low);
			return;
		}
		else{
			l->out();
			r->out();
		}
	}
} *root;

void buildWall(int n, int Q, int op[], int L[], int R[], int H[], int finalHeight[]){
	root = new node(0, n-1);
	for(int q = 0;q < Q;q++){
		root->update(L[q], R[q], op[q], H[q]);
	}
	root->out();
	for(int i = 0;i < n;i++) finalHeight[i] = ans[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...