Submission #522636

#TimeUsernameProblemLanguageResultExecution timeMemory
522636cig32Wall (IOI14_wall)C++17
100 / 100
886 ms90028 KiB
#include <bits/stdc++.h>
using namespace std;
#define pi pair<int,int>
#define mi first
#define ma second
 
struct SegTree {
	vector<pi> st;//first = min, second = max
	vector<bool> marked;
	vector<int> inds;
	int sz;
	
	void init(int n){// O(n)
		sz = n;
		st.assign(4*n, {0,0});
		marked.assign(4*n, 0);
	}
	
	void calc(int n){//O(1)
		st[n].mi =min(st[2*n+1].mi, st[2*n+2].mi);
		st[n].ma =max(st[2*n+1].ma, st[2*n+2].ma);
		
		if(st[n].mi == st[n].ma)
			marked[n] = true;
	}
	
	void push(int n){//O(1)
		
		st[2*n+1].mi = st[2*n+1].ma = st[n].mi;
		st[2*n+2].mi = st[2*n+2].ma = st[n].mi;
		marked[2*n+1] = marked[2*n+2] = true;
		
		marked[n] = false;
	}
	
	void add(int n, int l, int r, int s, int e, int val){
		if(l == s && r == e && st[n].ma <= val){
			st[n].mi = st[n].ma = val;
			marked[n] = true;
		}
		else if(l == s && r == e && st[n].mi >= val){
			return;
		}
		else if(l == r){
			//cout << l<<", "<<r<<endl;
			return;
		}
			
		else{
			int mid = (l+r) /2;
			//cout << n <<", "<<st[n].ma<<": "<<l<<", "<<r<<" - "<<s<<", "<<e<<": "<<val<<endl;
			if(marked[n])
				push(n);
				
			if(s<= mid)
				add(2*n+1, l, mid, s, min(e, mid), val);
			if(e > mid)
				add(2*n+2, mid +1, r, max(s, mid+1), e, val);
			calc(n);
		}
	}
	
	void rem(int n, int l, int r, int s, int e, int val){
		if(l == s && r == e && st[n].mi >= val){
			st[n].mi = st[n].ma = val;
			marked[n] = true;
		}
		else if(l == s && r == e && st[n].ma <= val){
			return;
		}
		else if(l == r)
			return;
		else{
			//cout << n <<", "<<st[n].mi<<": "<<l<<", "<<r<<" - "<<s<<", "<<e<<": "<<val<<endl;
			int mid = (l+r) /2;
			if(marked[n])
				push(n);
				
			if(s<= mid)
				rem(2*n+1, l, mid, s, min(e, mid), val);
			if(e > mid)
				rem(2*n+2, mid +1, r, max(s, mid+1), e, val);
			calc(n);
		}
	}
	
	
	pair<int,pair<int,int>> query(int n, int l, int r, int ind){
		if(l == r)
			return {st[n].mi,{l,r}};
			
		int mid = (l+r)/2;
		if(marked[n]){
			return {st[n].mi,{l,r}};
		}
			
		if( ind <= mid)
			return query(2*n+1,l , mid, ind);
		return query(2*n+2, mid+1, r, ind);
	}
	
	void print(){
		int cnt = 0;
		
		for(int i=0; i<(int)ceil(log2(sz)); i++){
			for(int j= 0; j< (1<< i); j++)
				cout << st[cnt].mi<<", "<<st[cnt].ma<<", "<<marked[cnt]<<"\t\t",cnt++;;
				
			cout<<endl;
		}
		cout <<endl<<endl;
	}
};
 
 
void buildWall (int n, int k, int op[], int left[], int right[], int height[], int finalHeight[]){
	SegTree st;
	st.init(n);
	//st.print();
	for(int i =0;i<k;i++){
		if(op[i] == 1){
			st.add(0,1,n,left[i]+1, right[i]+1, height[i]);
		}
		else{
			st.rem(0,1,n,left[i]+1, right[i]+1, height[i]);
		}
		//st.print();
	}
	//st.print();
	
	for(int i =1; i<=n;i++){
		pair<int,pair<int,int>> res =  st.query(0,1,n,i);
		i = res.second.first;
		int end = res.second.second;
		while(i <=end){
			finalHeight[i - 1] = res.first;
			i++;
		}
		--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...