bingxuan9112

TIOJ 1836

Nov 22nd, 2020 (edited)
164
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.50 KB | None | 0 0
  1. //   __________________
  2. //  | ________________ |
  3. //  ||          ____  ||
  4. //  ||   /\    |      ||
  5. //  ||  /__\   |      ||
  6. //  || /    \  |____  ||
  7. //  ||________________||
  8. //  |__________________|
  9. //  \###################\
  10. //   \###################\
  11. //    \        ____       \
  12. //     \_______\___\_______\
  13. // An AC a day keeps the doctor away.
  14.  
  15. #ifdef local
  16. #include <bits/extc++.h>
  17. #define safe std::cerr<<__PRETTY_FUNCTION__<<" line "<<__LINE__<<" safe\n"
  18. #define debug(args...) qqbx(#args, args)
  19. using ost = std::ostream;
  20. #define DESTL(STL, BEG, END, OUT) \
  21.     template <typename ...T> ost& operator<<(ost &O, std::STL<T...> v) { int f=0; for(auto x: v) O << (f++ ? ", " : BEG) << OUT; return O << END; }
  22. DESTL(deque, "[", "]", x); DESTL(vector, "[", "]", x);
  23. DESTL(set, "{", "}", x); DESTL(multiset, "{", "}", x); DESTL(unordered_set, "{", "}", x);
  24. DESTL(map , "{", "}", x.first << ":" << x.second); DESTL(unordered_map , "{", "}", x.first << ":" << x.second);
  25. template <typename U, typename V> ost& operator<<(ost &O, std::pair<U,V> p) { return O << '(' << p.first << ',' << p.second << ')'; }
  26. template <typename T, size_t N> ost& operator<<(ost &O, std::array<T,N> a) { int f=0; for(T x: a) O << (f++ ? ", " : "[") << x; return O << "]"; }
  27. template <typename T, size_t ...I> ost& prtuple(ost &O, T t, std::index_sequence<I...>) { return (..., (O << (I ? ", " : "(") << std::get<I>(t))), O << ")"; }
  28. template <typename ...T> ost& operator<<(ost &O, std::tuple<T...> t) { return prtuple(O, t, std::make_index_sequence<sizeof...(T)>()); }
  29. template <typename ...T> void qqbx(const char *s, T ...args) {
  30.     int cnt = sizeof...(T);
  31.     (std::cerr << "\033[1;32m(" << s << ") = (" , ... , (std::cerr << args << (--cnt ? ", " : ")\033[0m\n")));
  32. }
  33. #else
  34. #pragma GCC optimize("Ofast")
  35. #pragma loop_opt(on)
  36. #include <bits/extc++.h>
  37. #include <bits/stdc++.h>
  38. #define debug(...) ((void)0)
  39. #define safe ((void)0)
  40. #endif // local
  41. #define all(v) begin(v),end(v)
  42. #define get_pos(v,x) int(lower_bound(begin(v),end(v),x)-begin(v))
  43. #define sort_uni(v) sort(begin(v),end(v)),v.erase(unique(begin(v),end(v)),end(v))
  44. #define pb emplace_back
  45. #define ff first
  46. #define ss second
  47. #define mem(v,x) memset(v,x,sizeof v)
  48.  
  49. using namespace std;
  50. using namespace __gnu_pbds;
  51. typedef int64_t ll;
  52. typedef long double ld;
  53. typedef pair<ll,ll> pll;
  54. typedef pair<ld,ld> pld;
  55. template <typename T> using max_heap = std::priority_queue<T,vector<T>,less<T> >;
  56. template <typename T> using min_heap = std::priority_queue<T,vector<T>,greater<T> >;
  57. template <typename T> using rbt = tree<T,null_type,less<T>,rb_tree_tag,tree_order_statistics_node_update>;
  58. constexpr ld PI = acos(-1), eps = 1e-7;
  59. constexpr ll N = 1000025, INF = 1e18, MOD = 1000000007, K = 14699, inf = 1e9;
  60. constexpr inline ll cdiv(ll x, ll m) { return x/m + (x%m ? (x<0) ^ (m>0) : 0); } // ceiling divide
  61. constexpr inline ll modpow(ll e,ll p,ll m=MOD) { ll r=1; for(e%=m;p;p>>=1,e=e*e%m) if(p&1) r=r*e%m; return r; }
  62.  
  63. int R, C;
  64. class Segtree1d {
  65.     // 1d, dynamic
  66. private:
  67.     struct node {
  68.         ll ans;
  69.         node *l, *r;
  70.         node() : ans(0), l(nullptr), r(nullptr) {}
  71.         void pull() {
  72.             ans = __gcd( l ? l->ans : 0, r ? r->ans : 0 );
  73.         }
  74.     } *root;
  75.     void modify(int pos, ll v, node *&cur, int l, int r) {
  76.         if(!cur) cur = new node();
  77.         if(l+1 == r) {
  78.             cur->ans = v;
  79.             return;
  80.         }
  81.         int m = l+(r-l)/2;
  82.         if(pos < m)
  83.             modify(pos, v, cur->l, l, m);
  84.         else
  85.             modify(pos, v, cur->r, m, r);
  86.         cur->pull();
  87.     }
  88.     ll query(int ql, int qr, node *cur, int l, int r) {
  89.         if(l >= qr || r <= ql || !cur) return 0;
  90.         if(ql <= l && r <= qr) return cur->ans;
  91.         int m = l+(r-l)/2;
  92.         return __gcd(query(ql, qr, cur->l, l, m), query(ql, qr, cur->r, m, r));
  93.     }
  94. public:
  95.     Segtree1d() : root(nullptr) {}
  96.     void modify(int pos, ll v) {
  97.         modify(pos, v, root, 0, C);
  98.     }
  99.     ll query(int l, int r) {
  100.         return query(l, r, root, 0, C);
  101.     }
  102. };
  103.  
  104. class Segtree2d {
  105. private:
  106.     struct node {
  107.         Segtree1d st;
  108.         node *l, *r;
  109.         node() : l(nullptr), r(nullptr) {}
  110.         // Complexity of pull would TLE
  111.         // Notice that only posy would change
  112.         void pull(int y) {
  113.             st.modify(y, __gcd(l ? l->st.query(y, y+1) : 0, r ? r->st.query(y, y+1) : 0));
  114.         }
  115.     } *root;
  116.     void modify(int posx, int posy, ll v, node *&cur, int l, int r) {
  117.         if(!cur) cur = new node();
  118.         if(l+1 == r) {
  119.             cur->st.modify(posy, v);
  120.             return;
  121.         }
  122.         int m = l+(r-l)/2;
  123.         if(posx < m)
  124.             modify(posx, posy, v, cur->l, l, m);
  125.         else
  126.             modify(posx, posy, v, cur->r, m, r);
  127.         cur->pull(posy);
  128.     }
  129.     ll query(int lx, int rx, int ly, int ry, node *cur, int l, int r) {
  130.         if(r <= lx || l >= rx || !cur) return 0;
  131.         if(lx <= l && r <= rx) return cur->st.query(ly, ry);
  132.         int m = l+(r-l)/2;
  133.         return __gcd(query(lx, rx, ly, ry, cur->l, l, m), query(lx, rx, ly, ry, cur->r, m, r));
  134.     }
  135. public:
  136.     Segtree2d() : root(nullptr) {}
  137.     void modify(int posx, int posy, ll v) {
  138.         modify(posx, posy, v, root, 0, R);
  139.     }
  140.     ll query(int lx, int rx, int ly, int ry) {
  141.         return query(lx, rx, ly, ry, root, 0, R);
  142.     }
  143. } sgt;
  144. signed main() {
  145.     ios_base::sync_with_stdio(0), cin.tie(0);
  146.     int n;
  147.     cin >> R >> C >> n;
  148.     vector<int> ux, uy;
  149.     vector<tuple<int,int,int,int,int,ll>> Q(n);
  150.     for(auto &[t, x1, y1, x2, y2, k]: Q) {
  151.         cin >> t;
  152.         if(t == 1) {
  153.             cin >> x1 >> y1 >> k;
  154.             ux.pb(x1);
  155.             uy.pb(y1);
  156.         } else {
  157.             cin >> x1 >> y1 >> x2 >> y2;
  158.             if(x1 > x2) swap(x1, x2);
  159.             if(y1 > y2) swap(y1, y2);
  160.             ++x2, ++y2;
  161.             /* ux.pb(x1); */
  162.             /* ux.pb(x2); */
  163.             /* uy.pb(y1); */
  164.             /* uy.pb(y2); */
  165.         }
  166.     }
  167.     sort_uni(ux), sort_uni(uy);
  168.     R = ux.size(), C = uy.size();
  169.     for(auto &[t, x1, y1, x2, y2, k]: Q) {
  170.         if(t == 1) {
  171.             int x = get_pos(ux, x1);
  172.             int y = get_pos(uy, y1);
  173.             debug(x, y, k);
  174.             sgt.modify(x, y, k);
  175.         } else {
  176.             x1 = get_pos(ux, x1);
  177.             x2 = get_pos(ux, x2);
  178.             y1 = get_pos(uy, y1);
  179.             y2 = get_pos(uy, y2);
  180.             debug(x1, x2, y1, y2);
  181.             cout << sgt.query(x1, x2, y1, y2) << '\n';
  182.         }
  183.     }
  184. }
  185.  
Add Comment
Please, Sign In to add comment