Advertisement
Guest User

Untitled

a guest
Dec 8th, 2019
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.16 KB | None | 0 0
  1.  
  2. #include <iostream>
  3. #include <string>
  4. #include <unordered_map>
  5. #include <set>
  6. #include <vector>
  7.  
  8. using namespace std;
  9.  
  10. #include <cassert>
  11.  
  12. /** Begin fast allocation */
  13. const int MAX_MEM = 2e8;
  14. int mpos = 0;
  15. char mem[MAX_MEM];
  16. inline void * operator new ( size_t n ) {
  17.     assert((mpos += n) <= MAX_MEM);
  18.     return (void *)(mem + mpos - n);
  19. }
  20. inline void operator delete ( void * ) noexcept { } // must have!
  21. /** End fast allocation */
  22.  
  23. #include "optimization.h"
  24.  
  25. const int MAXN = 300001;
  26. int id, y;
  27.  
  28. int vect[MAXN];
  29. unordered_map<int, set<int>> table(MAXN); // по значению индекс
  30. set<pair<int, int>> setp; // количество, индекс
  31.  
  32. void change(int id, int y) {
  33.     setp.erase({(int)table[vect[id]].size(), *table[vect[id]].begin()});
  34.     table[vect[id]].erase(id); // убрать i из элементов в сете для данного значения
  35.     if ((int)table[vect[id]].size() > 0)
  36.         setp.insert({(int)table[vect[id]].size(), *table[vect[id]].begin()});
  37.  
  38.     setp.erase({(int)table[y].size(), *table[y].begin()});
  39.     table[y].insert(id);
  40.     setp.insert({(int)table[y].size(), *table[y].begin()});
  41.  
  42.     vect[id] = y; // изменить значение в векторе
  43.  
  44.     return;
  45. }
  46.  
  47. int get() {
  48.     return (*setp.begin()).second; // как правильно это написать?
  49. }
  50.  
  51. int main() {
  52.     ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
  53.     int n, q, ind;
  54.     n = readInt();
  55.     int a;
  56.     for (int i = 0; i < n; i++) {
  57.         a = readInt();
  58.         vect[i] = a;
  59.         table[a].insert(i);
  60.         // надо снова как в change пройтись по всему сету? мб вообще можно как-то вызвать change...
  61.     }
  62.     for (auto it : table) {
  63.         setp.insert({(int)it.second.size(), *it.second.begin()});
  64.     }
  65.     q = readInt();
  66.     string s;
  67.     char c;
  68.     int id, y;
  69.     for (int i = 0; i < q; i++) {
  70.         c = readChar();
  71.         if (c == '?') {
  72.             writeInt(get(), '\n');
  73.         } else {
  74.             id = readInt();
  75.             y = readInt();
  76.             change(id, y);
  77.         }
  78.     }
  79.     return 0;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement