Submission #308348

#TimeUsernameProblemLanguageResultExecution timeMemory
308348super_j6Wall (IOI14_wall)C++14
0 / 100
173 ms15224 KiB
#include "wall.h"
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
#define endl '\n'
#define ll long long
#define pi pair<int, int>
#define f first
#define s second

const int inf = 0x3f3f3f3f;

struct segTree{
	int l, r;
	segTree *tl, *tr;
	int mx1, mx2, mxl, mn1, mn2, mnl;
	
	segTree(int a, int b){
		l = a, r = b;
		mx1 = mn1 = 0, mx2 = -inf, mn2 = inf, mxl = mnl = -1;
		if(l != r){
			int mid = (l + r) / 2;
			tl = new segTree(l, mid);
			tr = new segTree(mid + 1, r);
		}
	}
	
	void upx(int x){
		if(mx1 == mn1) mx1 = x;
		if(mx2 == mn1) mx2 = x;
		mn1 = x, mnl = x;
	}
	
	void upn(int x){
		if(mn1 == mx1) mn1 = x;
		if(mn2 == mx1) mn2 = x;
		mx1 = x, mnl = x;
	}
	
	void pull(){
		mx1 = max(tl->mx1, tr->mx1);
		mx2 = max(tl->mx2, tr->mx2);
		if(tl->mx1 != mx1) mx2 = max(mx2, tl->mx1);
		if(tr->mx1 != mx1) mx2 = max(mx2, tr->mx1);
		
		mn1 = min(tl->mn1, tl->mn1);
		mn2 = min(tl->mn2, tr->mn2);
		if(tl->mn1 != mn1) mn2 = min(mn2, tl->mn2);
		if(tr->mn1 != mn1) mn2 = min(mn2, tr->mn2);
	}
	
	void push(){
		if(~mxl) tl->upx(mxl), tr->upx(mxl);
		if(~mnl) tl->upn(mnl), tr->upn(mnl);
		mxl = mnl = -1;
	}
	
	void adx(int a, int b, int v){
		if(b < l || r < a || v <= mn1) return;
		if(a <= l && r <= b && v < mn2) return upx(v);
		tl->push(), tr->push();
		tl->adx(a, b, v), tr->adx(a, b, v);
		pull();
	}
	
	void adn(int a, int b, int v){
		if(b < l || r < a || v >= mx1) return;
		if(a <= l && r <= b && v > mx2) return upn(v);
		tl->push(), tr->push();
		tl->adx(a, b, v), tr->adx(a, b, v);
		pull();
	}
	
	void sol(int ans[]){
		if(l == r) return (void)(ans[l] = mn1);
		tl->push(), tr->push();
		tl->sol(ans), tr->sol(ans);
	}
};

void buildWall(int n, int k, int a[], int l[], int r[], int h[], int ans[]){
	segTree tre(0, n - 1);
	
	for(int i = 0; i < k; i++){
		if(a[i] & 1) tre.adx(l[i], r[i], h[i]);
		else tre.adn(l[i], r[i], h[i]);
	}
	
	tre.sol(ans);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...