Advertisement
ThegeekKnight16

Wine Production

Dec 10th, 2022
1,204
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.80 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int MAXN = 3e4 + 10;
  4. vector<tuple<int, int, int> > queries;
  5. set<int> poss;
  6. map<int, int> Comp;
  7. int Freq[MAXN];
  8. int FFreq[MAXN];
  9. int temp[MAXN];
  10. int resp[MAXN];
  11. int T;
  12.  
  13. bool cmp(tuple<int, int, int> a, tuple<int, int, int> b)
  14. {
  15.     auto [aP, aQ, aId] = a;
  16.     auto [bP, bQ, bId] = b;
  17.     if (aP / T == bP / T) return aQ < bQ;
  18.     return aP < bP;
  19. }
  20.  
  21. void add(int x)
  22. {
  23.     Freq[x]++;
  24.     FFreq[Freq[x]]++;
  25. }
  26.  
  27. void remove(int x)
  28. {
  29.     FFreq[Freq[x]]--;
  30.     Freq[x]--;
  31. }
  32.  
  33. int BUSCA_BINARIA(int N)
  34. {
  35.     int ini = 1; int fim = N;
  36.     while (ini < fim)
  37.     {
  38.         int m = (ini + fim) / 2;
  39.         if (ini == fim-1) m = fim;
  40.         if (m <= FFreq[m]) ini = m;
  41.         else fim = m-1;
  42.     }
  43.     return ini;
  44. }
  45.  
  46. int main()
  47. {
  48.     ios_base::sync_with_stdio(false);
  49.     cin.tie(NULL);
  50.     int N, Q;
  51.     cin >> N >> Q;
  52.     T = sqrt(N) + 1;
  53.     for (int i = 1; i <= N; i++) {cin >> temp[i]; poss.insert(temp[i]);}
  54.     int count = 0;
  55.     for (auto t : poss) Comp[t] = ++count;
  56.     for (int i = 1; i <=  N; i++) temp[i] = Comp[temp[i]];
  57.  
  58.     for (int q = 1; q <= Q; q++)
  59.     {
  60.         int X, Y;
  61.         cin >> X >> Y;
  62.         queries.emplace_back(X, Y, q);
  63.     }
  64.     sort(queries.begin(), queries.end(), cmp);
  65.  
  66.     int p = get<0>(queries[0]); int q = get<1>(queries[0]);
  67.     for (int i = p; i <= q; i++) add(temp[i]);
  68.     for (auto query : queries)
  69.     {
  70.         auto [l, r, id] = query;
  71.         // cerr << p << " " << q << " " << l << " " << r << '\n';
  72.         while (p > l) add(temp[--p]);
  73.         while (q < r) add(temp[++q]);
  74.         while (p < l) remove(temp[p++]);
  75.         while (q > r) remove(temp[q--]);
  76.  
  77.         resp[id] = BUSCA_BINARIA(N);
  78.     }
  79.  
  80.     for (int i = 1; i <= Q; i++) cout << resp[i] << '\n';
  81. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement