제출 #18099

#제출 시각아이디문제언어결과실행 시간메모리
18099comet벽 (IOI14_wall)C++98
100 / 100
1743 ms55784 KiB
#include "wall.h"
#include <cstdio>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;

#define LL 2*k+1
#define RR 2*k+2

int lo[5000010],hi[5000010];

void up(int k){
	lo[k]=min(lo[LL],lo[RR]);
	hi[k]=max(hi[LL],hi[RR]);
}

void down(int k){
	lo[LL]=max(lo[LL],lo[k]);
	hi[LL]=max(hi[LL],lo[LL]);
	lo[RR]=max(lo[RR],lo[k]);
	hi[RR]=max(hi[RR],lo[RR]);

	hi[LL]=min(hi[LL],hi[k]);
	lo[LL]=min(lo[LL],hi[LL]);
	hi[RR]=min(hi[RR],hi[k]);
	lo[RR]=min(lo[RR],hi[RR]);
}

void update(int s,int e,int L,int R,int D,int c,int k){
	if(e<L||s>R)return;
	if(L<=s&&e<=R){
		if(D==1){
			lo[k]=max(lo[k],c);
			hi[k]=max(hi[k],lo[k]);
		}
		if(D==2){
			hi[k]=min(hi[k],c);
			lo[k]=min(lo[k],hi[k]);
		}
		return;
	}
	down(k);
	int mid=(s+e)/2;
	update(s,mid,L,R,D,c,LL);
	update(mid+1,e,L,R,D,c,RR);
	up(k);
}

int query(int s,int e,int x,int k){
	if(s==e){
		return lo[k];
	}
	down(k);
	int mid=(s+e)/2;
	if(x<=mid)return query(s,mid,x,LL);
	return query(mid+1,e,x,RR);
}

#undef LL
#undef RR

void buildWall(int n,int k,int op[],int left[],int right[],int height[],int finalHeight[]){
	for(int i=0;i<k;i++){
		update(0,n-1,left[i],right[i],op[i],height[i],0);
	}
	for(int i=0;i<n;i++){
		finalHeight[i]=query(0,n-1,i,0);
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...