Advertisement
Guest User

Untitled

a guest
Feb 18th, 2020
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.37 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. #define NMAX 100005
  4. using namespace std;
  5.  
  6. ifstream fin("marbles.in");
  7. ofstream fout("marbles.out");
  8.  
  9. struct chestie
  10. {
  11. int first, second, wh;
  12. };
  13.  
  14. vector<chestie> buckets[1005];
  15. int fr[NMAX], rez[NMAX], maxim, which, auMa, whi1, v[NMAX];
  16.  
  17. inline bool cmp(chestie a, chestie b)
  18. {
  19. return a.second < b.second;
  20. }
  21.  
  22. void Add(int val)
  23. {
  24. fr[val]++;
  25. if(fr[val] > maxim)
  26. {
  27. maxim = fr[val];
  28. which = val;
  29. }
  30. else if(fr[val] == maxim)
  31. which = min(val, which);
  32. }
  33.  
  34. void AddL(int val)
  35. {
  36. if(fr[val] > auMa)
  37. {
  38. auMa = fr[val];
  39. whi1 = val;
  40. }
  41. else if(fr[val] == auMa)
  42. whi1 = min(whi1, val);
  43. }
  44.  
  45. int main()
  46. {
  47. int n, m;
  48. fin >> n >> m;
  49.  
  50. for(int i = 1; i <= n; ++i)
  51. fin >> v[i];
  52.  
  53. int bucket = sqrt(n);
  54. int nrB = bucket + (bool)n % bucket;
  55. for(int i = 1; i <= m; ++i)
  56. {
  57. int st, dr;
  58. fin >> st >> dr;
  59.  
  60. buckets[st / bucket].push_back({st, dr, i});
  61. }
  62.  
  63. for(int buk = 0; buk < nrB; ++buk)
  64. {
  65. if(buckets[buk].size() > 0)
  66. {
  67. sort(buckets[buk].begin(), buckets[buk].end(), cmp);
  68. memset(fr, 0, sizeof(fr));
  69. for(int i = (buk + 1) * bucket; i <= buckets[buk][0].second; ++i)
  70. {
  71. Add(v[i]);
  72. AddL(v[i]);
  73. }
  74. int lim = min((buk + 1) * bucket, buckets[buk][0].second + 1);
  75. for(int i = buckets[buk][0].first; i < lim; ++i)
  76. Add(v[i]);
  77. rez[buckets[buk][0].wh] = which;
  78. for(int i = 1; i < buckets[buk].size(); ++i)
  79. {
  80. lim = min((buk + 1) * bucket, buckets[buk][i - 1].second + 1);
  81. for(int j = buckets[buk][i - 1].first; j < lim; ++j)
  82. fr[v[j]]--;
  83. for(int j = buckets[buk][i - 1].second + 1; j <= buckets[buk][i].second; ++j)
  84. AddL(v[j]);
  85. maxim = auMa;
  86. which = whi1;
  87. lim = min((buk + 1) * bucket, buckets[buk][i].second + 1);
  88. for(int j = buckets[buk][i].first; j < lim; ++j)
  89. Add(v[j]);
  90. rez[buckets[buk][i].wh] = which;
  91. }
  92. }
  93. }
  94.  
  95. for(int i = 1; i <= m; ++i)
  96. fout << rez[i] << '\n';
  97. return 0;
  98. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement