Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //
- // main.cpp
- // zal2
- //
- // Created by Mateusz Detko on 27.11.2016.
- // Copyright © 2016 Mateusz Detko. All rights reserved.
- //
- #include <iostream>
- #include <tuple>
- #include <vector>
- #include <set>
- #include <algorithm>
- using namespace std;
- const int liczbaManifestacji = 1000000;
- int liczbaObywateli, liczbaMomentow;
- // nrMomentu, nrManifestacji, rodzaj: 0-poczatek, 1-zapytanie, 2-koniec
- vector<tuple<int, int, int>> wejscie;
- vector<int> zapytania;
- int liczbaOsob[liczbaManifestacji+1];
- pair<int, int> odpowiedz[liczbaManifestacji+1];
- void wczytajDane() {
- for (int i = 0; i < liczbaObywateli; i++) {
- int a, b, c;
- scanf("%d %d %d", &a, &b, &c);
- wejscie.push_back(make_tuple(a, c, 0));
- wejscie.push_back(make_tuple(b, c, 2));
- }
- for (int i = 0; i < liczbaMomentow; i++) {
- int a;
- scanf("%d", &a);
- wejscie.push_back(make_tuple(a, -1, 1));
- zapytania.push_back(a);
- }
- for (int i = 0; i <= liczbaManifestacji; i++) {
- liczbaOsob[i] = 0;
- }
- }
- struct setCompare
- {
- bool operator () (const int & id1, const int & id2)
- {
- if (liczbaOsob[id1] == liczbaOsob[id2])
- return (id1 > id2);
- else
- return (liczbaOsob[id1] < liczbaOsob[id2]);
- }
- };
- struct TupleCompare
- {
- template<typename T>
- bool operator()(T const &t1, T const &t2)
- {
- if (get<0>(t1) == get<0>(t2))
- return (get<2>(t1) < get<2>(t2));
- else
- return (get<0>(t1) < get<0>(t2));
- }
- };
- set<int, setCompare> setManifestacji;
- void solution() {
- for (int i = 0; i < wejscie.size(); i++) {
- int rodzaj = get<2>(wejscie[i]);
- std::set<int, setCompare>::iterator it;
- if (rodzaj == 0) { //poczatek
- liczbaOsob[get<1>(wejscie[i])]++;
- it = setManifestacji.find(get<1>(wejscie[i]));
- if (it != setManifestacji.end())
- setManifestacji.erase(it);
- setManifestacji.insert(get<1>(wejscie[i]));
- }
- else if (rodzaj == 2) { //koniec
- liczbaOsob[get<1>(wejscie[i])]--;
- it = setManifestacji.find(get<1>(wejscie[i]));
- if (it != setManifestacji.end())
- setManifestacji.erase(it);
- setManifestacji.insert(get<1>(wejscie[i]));
- }
- else { //zapytanie
- int id = *setManifestacji.rbegin();
- if (liczbaOsob[id] == 0)
- id = 1;
- odpowiedz[get<0>(wejscie[i])] = make_pair(id, liczbaOsob[id]);
- }
- }
- }
- void wypiszOdpowiedzi() {
- for (int i = 0; i < zapytania.size(); i++) {
- printf("%d %d\n", odpowiedz[zapytania[i]].first, odpowiedz[zapytania[i]].second);
- }
- }
- int main(int argc, const char * argv[]) {
- scanf("%d %d", &liczbaObywateli, &liczbaMomentow);
- wczytajDane();
- sort(begin(wejscie), end(wejscie), TupleCompare());
- solution();
- wypiszOdpowiedzi();
- return 0;
- }
- /*
- 5 4
- 2 10 3
- 3 8 2
- 6 8 3
- 13 15 6
- 12 15 5
- 14
- 2
- 11
- 8
- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement