Submission #920518

#TimeUsernameProblemLanguageResultExecution timeMemory
920518Nika533Wall (IOI14_wall)C++17
100 / 100
581 ms163352 KiB
#pragma GCC diagnostic warning "-std=c++11"

#include <bits/stdc++.h>
#include "wall.h"

#define pb push_back
#define f first
#define s second
#define MOD 1000000007
#define flush fflush(stdout)
#define all(x) (x).begin(),(x).end()
#define allr(x) (x).rbegin(), (x).rend()
#define pii pair<int,int>

using namespace std;

const int N=2e6+5,K=5e5+5;

pii t[K*4];
vector<int> L[N],R[N];

pii merge(pii a, pii b) {
	pii c;
	if (b.f==-1) return b;
	if (a.f==-1) {
		c.f=-1;
		if (a.s<b.f) c.s=b.f;
		else if (a.s>b.s) c.s=b.s;
		else c.s=a.s;
		return c;
	}
	int l=max(a.f,b.f),r=min(a.s,b.s);
	if (l<=r) return {l,r};
	if (a.s<b.s) return {-1,b.f};
	else return {-1,b.s};
}

void update(int v, int tl, int tr, int ind, int x, int y) {
	if (tl==tr) {
		t[v]={x,y};
		return;
	}
	int mid=(tl+tr)/2;
	if (ind<=mid) update(v*2,tl,mid,ind,x,y);
	else update(v*2+1,mid+1,tr,ind,x,y);
	t[v]=merge(t[v*2],t[v*2+1]);
}

pii query(int v, int tl, int tr, int l, int r) {
	if (tl==l && tr==r) return t[v];
	int mid=(tl+tr)/2;
	if (r<=mid) return query(v*2,tl,mid,l,r);
	else if (mid+1<=l) return query(v*2+1,mid+1,tr,l,r);
	else return merge(query(v*2,tl,mid,l,mid),query(v*2+1,mid+1,tr,mid+1,r));
}

void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[]){
	
	for (int i=0; i<k; i++) {
		L[left[i]].pb(i);
		R[right[i]].pb(i);
	}
	
	for (int i=0; i<k; i++) update(1,0,k-1,i,0,1e9);
	
	for (int i=0; i<n; i++) {
		
//		cout<<"I "<<i<<endl;
//		
//		for (int i=0; i<k*4; i++) {
//			cout<<"TTT "<<i<<" "<<t[i].f<<" "<<t[i].s<<endl;
//		}
		
		if (i) {
			for (auto x:R[i-1]) {
				update(1,0,k-1,x,0,1e9);
			}
		}
		
		for (auto x:L[i]) {
			if (op[x]==1) update(1,0,k-1,x,height[x],1e9);
			else update(1,0,k-1,x,0,height[x]);
		}
		
		pii ans=query(1,0,k-1,0,k-1);
		
		if (ans.f==-1) finalHeight[i]=ans.s;
		else finalHeight[i]=ans.f;
	}
}

Compilation message (stderr)

wall.cpp:1:32: warning: '-std=c++11' is not an option that controls warnings [-Wpragmas]
    1 | #pragma GCC diagnostic warning "-std=c++11"
      |                                ^~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...