Infernale

GCD Segment Tree 200ms [PASS]

Apr 18th, 2020
417
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.63 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define INF INT_MAX
  5. #define LINF LLONG_MAX
  6. #define pb(x) push_back(x)
  7. #define all(x) (x).begin(), (x).end()
  8. #define debug(x) cerr << #x << " = " << x << endl;
  9.    
  10. using ll = long long;
  11. using pii = pair<int, int>;
  12. using vi = vector<int>;
  13. using vii = vector<vi>;
  14. using vll = vector<ll>;
  15.  
  16. void init(){
  17.     #ifdef LOCAL
  18.         freopen("input.txt", "r", stdin);
  19.         freopen("output.txt", "w", stdout);
  20.         freopen("log.txt", "w", stderr);
  21.     #else
  22.         cin.tie(0); cout.tie(0);
  23.         ios_base::sync_with_stdio(0);
  24.     #endif
  25. }
  26.  
  27. const int N = 200000;
  28. int currIdx = 0;
  29. int ST[N] = {0};
  30. int ele[N];
  31.  
  32. void updateTree(int p, int v){
  33.     ST[N/2 + p] = v;
  34.     p += N/2;
  35.     for(int i=p; i>1; i>>=1){
  36.         ST[i >> 1] = __gcd(ST[i], ST[i^1]);
  37.     }
  38. }
  39.  
  40. int main(){
  41.     init();
  42.     unordered_map<int, pii> mp;
  43.     int q, x;
  44.     cin >> q;
  45.     char c;
  46.     while(q--){
  47.         cin >> c >> x;
  48.         switch(c){
  49.             case '+':
  50.                 mp[x].second++;
  51.                 if(mp[x].second == 1){
  52.                     mp[x].first = currIdx;
  53.                     ele[currIdx] = x;
  54.                     updateTree(currIdx, x);
  55.                     currIdx++;
  56.                 }
  57.                 break;
  58.             case '-':
  59.                 mp[x].second--;
  60.                 if(mp[x].second == 0){
  61.                     updateTree(mp[x].first, 0);
  62.                     mp.erase(x);
  63.                 }
  64.                 break;
  65.         }
  66.         if(mp.size() == 0)
  67.             cout << 1 << endl;
  68.         else
  69.             cout << ST[1] << endl;
  70.     }
  71.     return 0;
  72. }
Add Comment
Please, Sign In to add comment