Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // __________________
- // | ________________ |
- // || ____ ||
- // || /\ | ||
- // || /__\ | ||
- // || / \ |____ ||
- // ||________________||
- // |__________________|
- // \###################\
- // \###################\
- // \ ____ \
- // \_______\___\_______\
- // An AC a day keeps the doctor away.
- #ifdef local
- #include <bits/extc++.h>
- #define safe std::cerr<<__PRETTY_FUNCTION__<<" line "<<__LINE__<<" safe\n"
- #define debug(args...) qqbx(#args, args)
- using ost = std::ostream;
- #define DESTL(STL, BEG, END, OUT) \
- 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; }
- DESTL(deque, "[", "]", x); DESTL(vector, "[", "]", x);
- DESTL(set, "{", "}", x); DESTL(multiset, "{", "}", x); DESTL(unordered_set, "{", "}", x);
- DESTL(map , "{", "}", x.first << ":" << x.second); DESTL(unordered_map , "{", "}", x.first << ":" << x.second);
- template <typename U, typename V> ost& operator<<(ost &O, std::pair<U,V> p) { return O << '(' << p.first << ',' << p.second << ')'; }
- 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 << "]"; }
- template <typename T, size_t ...I> ost& prtuple(ost &O, T t, std::index_sequence<I...>) { return (..., (O << (I ? ", " : "(") << std::get<I>(t))), O << ")"; }
- template <typename ...T> ost& operator<<(ost &O, std::tuple<T...> t) { return prtuple(O, t, std::make_index_sequence<sizeof...(T)>()); }
- template <typename ...T> void qqbx(const char *s, T ...args) {
- int cnt = sizeof...(T);
- (std::cerr << "\033[1;32m(" << s << ") = (" , ... , (std::cerr << args << (--cnt ? ", " : ")\033[0m\n")));
- }
- #else
- #pragma GCC optimize("Ofast")
- #pragma loop_opt(on)
- #include <bits/extc++.h>
- #include <bits/stdc++.h>
- #define debug(...) ((void)0)
- #define safe ((void)0)
- #endif // local
- #define all(v) begin(v),end(v)
- #define get_pos(v,x) int(lower_bound(begin(v),end(v),x)-begin(v))
- #define sort_uni(v) sort(begin(v),end(v)),v.erase(unique(begin(v),end(v)),end(v))
- #define pb emplace_back
- #define ff first
- #define ss second
- #define mem(v,x) memset(v,x,sizeof v)
- using namespace std;
- using namespace __gnu_pbds;
- typedef int64_t ll;
- typedef long double ld;
- typedef pair<ll,ll> pll;
- typedef pair<ld,ld> pld;
- template <typename T> using max_heap = std::priority_queue<T,vector<T>,less<T> >;
- template <typename T> using min_heap = std::priority_queue<T,vector<T>,greater<T> >;
- template <typename T> using rbt = tree<T,null_type,less<T>,rb_tree_tag,tree_order_statistics_node_update>;
- constexpr ld PI = acos(-1), eps = 1e-7;
- constexpr ll N = 1000025, INF = 1e18, MOD = 1000000007, K = 14699, inf = 1e9;
- constexpr inline ll cdiv(ll x, ll m) { return x/m + (x%m ? (x<0) ^ (m>0) : 0); } // ceiling divide
- 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; }
- int R, C;
- class Segtree1d {
- // 1d, dynamic
- private:
- struct node {
- ll ans;
- node *l, *r;
- node() : ans(0), l(nullptr), r(nullptr) {}
- void pull() {
- ans = __gcd( l ? l->ans : 0, r ? r->ans : 0 );
- }
- } *root;
- void modify(int pos, ll v, node *&cur, int l, int r) {
- if(!cur) cur = new node();
- if(l+1 == r) {
- cur->ans = v;
- return;
- }
- int m = l+(r-l)/2;
- if(pos < m)
- modify(pos, v, cur->l, l, m);
- else
- modify(pos, v, cur->r, m, r);
- cur->pull();
- }
- ll query(int ql, int qr, node *cur, int l, int r) {
- if(l >= qr || r <= ql || !cur) return 0;
- if(ql <= l && r <= qr) return cur->ans;
- int m = l+(r-l)/2;
- return __gcd(query(ql, qr, cur->l, l, m), query(ql, qr, cur->r, m, r));
- }
- public:
- Segtree1d() : root(nullptr) {}
- void modify(int pos, ll v) {
- modify(pos, v, root, 0, C);
- }
- ll query(int l, int r) {
- return query(l, r, root, 0, C);
- }
- };
- class Segtree2d {
- private:
- struct node {
- Segtree1d st;
- node *l, *r;
- node() : l(nullptr), r(nullptr) {}
- // Complexity of pull would TLE
- // Notice that only posy would change
- void pull(int y) {
- st.modify(y, __gcd(l ? l->st.query(y, y+1) : 0, r ? r->st.query(y, y+1) : 0));
- }
- } *root;
- void modify(int posx, int posy, ll v, node *&cur, int l, int r) {
- if(!cur) cur = new node();
- if(l+1 == r) {
- cur->st.modify(posy, v);
- return;
- }
- int m = l+(r-l)/2;
- if(posx < m)
- modify(posx, posy, v, cur->l, l, m);
- else
- modify(posx, posy, v, cur->r, m, r);
- cur->pull(posy);
- }
- ll query(int lx, int rx, int ly, int ry, node *cur, int l, int r) {
- if(r <= lx || l >= rx || !cur) return 0;
- if(lx <= l && r <= rx) return cur->st.query(ly, ry);
- int m = l+(r-l)/2;
- return __gcd(query(lx, rx, ly, ry, cur->l, l, m), query(lx, rx, ly, ry, cur->r, m, r));
- }
- public:
- Segtree2d() : root(nullptr) {}
- void modify(int posx, int posy, ll v) {
- modify(posx, posy, v, root, 0, R);
- }
- ll query(int lx, int rx, int ly, int ry) {
- return query(lx, rx, ly, ry, root, 0, R);
- }
- } sgt;
- signed main() {
- ios_base::sync_with_stdio(0), cin.tie(0);
- int n;
- cin >> R >> C >> n;
- vector<int> ux, uy;
- vector<tuple<int,int,int,int,int,ll>> Q(n);
- for(auto &[t, x1, y1, x2, y2, k]: Q) {
- cin >> t;
- if(t == 1) {
- cin >> x1 >> y1 >> k;
- ux.pb(x1);
- uy.pb(y1);
- } else {
- cin >> x1 >> y1 >> x2 >> y2;
- if(x1 > x2) swap(x1, x2);
- if(y1 > y2) swap(y1, y2);
- ++x2, ++y2;
- /* ux.pb(x1); */
- /* ux.pb(x2); */
- /* uy.pb(y1); */
- /* uy.pb(y2); */
- }
- }
- sort_uni(ux), sort_uni(uy);
- R = ux.size(), C = uy.size();
- for(auto &[t, x1, y1, x2, y2, k]: Q) {
- if(t == 1) {
- int x = get_pos(ux, x1);
- int y = get_pos(uy, y1);
- debug(x, y, k);
- sgt.modify(x, y, k);
- } else {
- x1 = get_pos(ux, x1);
- x2 = get_pos(ux, x2);
- y1 = get_pos(uy, y1);
- y2 = get_pos(uy, y2);
- debug(x1, x2, y1, y2);
- cout << sgt.query(x1, x2, y1, y2) << '\n';
- }
- }
- }
Add Comment
Please, Sign In to add comment