Submission #1357119

#TimeUsernameProblemLanguageResultExecution timeMemory
1357119MatjazNew Home (APIO18_new_home)C++20
12 / 100
5094 ms32584 KiB
#include<iostream>
#include<vector>
#include<set>
#include<queue> 
#include<algorithm>

using namespace std;

struct Event{
	int t;
	int type;
	int l;
	int index; 

	bool operator<(const Event& other) const{
		if (t != other.t){
			return t < other.t;
		}

		return type < other.type;
	}
};

int main(){

	int n,q,k;

	cin >> n >> k >> q; 

	int x;
	int t;
	int a;
	int b;

	vector<Event> events;

	// Store of type t[i] opens at location x
	// Store of type t[i] closes at location x
	// We want to know the quality of living at location y
	// (time, query type (openings come before queries, come before closings), location, type/query index)


	for (int i=0;i<n;i++){
		cin >> x >> t >> a >> b;

		Event e1 = {a, -1, x, t - 1};
		Event e2 = {b, 1, x, t - 1};
		events.push_back(e1); 
		events.push_back(e2); 
	}

	vector<int> answer(q, -1);

	for (int i=0;i<q;i++){
		int l,y;
		cin >> l >> y;
		Event e = {y, 0, l, i};
		events.push_back(e); 

	}

	sort(events.begin(), events.end());
	//cout << events.size() << endl;
	vector<multiset<int> > store(k);
	//cout << store.size() << endl;

	for (int i=0;i<events.size();i++){
		int event_type = events[i].type;
		//cout << event_type << endl;
		if (event_type == -1){
			int store_type = events[i].index;
			int l = events[i].l;
			store[store_type].insert(l);
		}

		if (event_type == 1){
			int store_type = events[i].index;
			int l = events[i].l;
			auto it = store[store_type].find(l);
			store[store_type].erase(it);
		}

		if (event_type == 0){
			int index = events[i].index;
			int l = events[i].l;

			answer[index] = 0;

			for (int j=0;j<k;j++){
				int nearest = 100000001;
				if (store[j].size() != 0){
					auto it = store[j].upper_bound(l);
					if (it != store[j].end()) nearest = abs(*it - l);
					if (it != store[j].begin()){
						it--;
						nearest = min(nearest, abs(l - *it));
					} 
				}

				answer[index] = max(answer[index], nearest);
			}

			if (answer[index] == 100000001) answer[index] = -1;
		}
	}

	for (int i=0;i<q;i++) cout << answer[i] << endl;

	return 0;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...