Advertisement
Guest User

Untitled

a guest
Dec 8th, 2016
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.12 KB | None | 0 0
  1. //
  2. // main.cpp
  3. // zal2
  4. //
  5. // Created by Mateusz Detko on 27.11.2016.
  6. // Copyright © 2016 Mateusz Detko. All rights reserved.
  7. //
  8.  
  9. #include <iostream>
  10. #include <tuple>
  11. #include <vector>
  12. #include <set>
  13. #include <algorithm>
  14.  
  15. using namespace std;
  16.  
  17. const int liczbaManifestacji = 1000000;
  18. int liczbaObywateli, liczbaMomentow;
  19.  
  20. // nrMomentu, nrManifestacji, rodzaj: 0-poczatek, 1-zapytanie, 2-koniec
  21. vector<tuple<int, int, int>> wejscie;
  22. vector<int> zapytania;
  23. int liczbaOsob[liczbaManifestacji+1];
  24. pair<int, int> odpowiedz[liczbaManifestacji+1];
  25.  
  26.  
  27. void wczytajDane() {
  28. for (int i = 0; i < liczbaObywateli; i++) {
  29. int a, b, c;
  30. scanf("%d %d %d", &a, &b, &c);
  31. wejscie.push_back(make_tuple(a, c, 0));
  32. wejscie.push_back(make_tuple(b, c, 2));
  33. }
  34.  
  35. for (int i = 0; i < liczbaMomentow; i++) {
  36. int a;
  37. scanf("%d", &a);
  38. wejscie.push_back(make_tuple(a, -1, 1));
  39. zapytania.push_back(a);
  40. }
  41.  
  42. for (int i = 0; i <= liczbaManifestacji; i++) {
  43. liczbaOsob[i] = 0;
  44. }
  45. }
  46.  
  47. struct setCompare
  48. {
  49. bool operator () (const int & id1, const int & id2)
  50. {
  51. if (liczbaOsob[id1] == liczbaOsob[id2])
  52. return (id1 > id2);
  53. else
  54. return (liczbaOsob[id1] < liczbaOsob[id2]);
  55. }
  56. };
  57.  
  58. struct TupleCompare
  59. {
  60. template<typename T>
  61. bool operator()(T const &t1, T const &t2)
  62. {
  63. if (get<0>(t1) == get<0>(t2))
  64. return (get<2>(t1) < get<2>(t2));
  65. else
  66. return (get<0>(t1) < get<0>(t2));
  67. }
  68. };
  69.  
  70. set<int, setCompare> setManifestacji;
  71.  
  72. void solution() {
  73. for (int i = 0; i < wejscie.size(); i++) {
  74. int rodzaj = get<2>(wejscie[i]);
  75. std::set<int, setCompare>::iterator it;
  76.  
  77.  
  78. if (rodzaj == 0) { //poczatek
  79. liczbaOsob[get<1>(wejscie[i])]++;
  80. it = setManifestacji.find(get<1>(wejscie[i]));
  81. if (it != setManifestacji.end())
  82. setManifestacji.erase(it);
  83. setManifestacji.insert(get<1>(wejscie[i]));
  84. }
  85. else if (rodzaj == 2) { //koniec
  86. liczbaOsob[get<1>(wejscie[i])]--;
  87. it = setManifestacji.find(get<1>(wejscie[i]));
  88. if (it != setManifestacji.end())
  89. setManifestacji.erase(it);
  90. setManifestacji.insert(get<1>(wejscie[i]));
  91. }
  92. else { //zapytanie
  93. int id = *setManifestacji.rbegin();
  94. if (liczbaOsob[id] == 0)
  95. id = 1;
  96. odpowiedz[get<0>(wejscie[i])] = make_pair(id, liczbaOsob[id]);
  97. }
  98. }
  99. }
  100.  
  101. void wypiszOdpowiedzi() {
  102. for (int i = 0; i < zapytania.size(); i++) {
  103. printf("%d %d\n", odpowiedz[zapytania[i]].first, odpowiedz[zapytania[i]].second);
  104. }
  105. }
  106.  
  107. int main(int argc, const char * argv[]) {
  108. scanf("%d %d", &liczbaObywateli, &liczbaMomentow);
  109.  
  110. wczytajDane();
  111. sort(begin(wejscie), end(wejscie), TupleCompare());
  112.  
  113. solution();
  114. wypiszOdpowiedzi();
  115.  
  116. return 0;
  117. }
  118.  
  119. /*
  120. 5 4
  121. 2 10 3
  122. 3 8 2
  123. 6 8 3
  124. 13 15 6
  125. 12 15 5
  126. 14
  127. 2
  128. 11
  129. 8
  130. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement