Submission #1184003

#TimeUsernameProblemLanguageResultExecution timeMemory
1184003HanksburgerGame (IOI13_game)C++20
100 / 100
2480 ms83064 KiB
#include "game.h" #include <bits/stdc++.h> #define ll long long using namespace std; struct node2 { node2 *lc, *rc; ll l, r, val; node2(ll l, ll r) : lc(0), rc(0), l(l), r(r), val(0) {} }; struct node1 { node1 *lc, *rc; node2 *x; ll l, r; node1(ll l, ll r) : lc(0), rc(0), x(0), l(l), r(r) {} } root(0, 1e9); void upd2(node2 *i, ll y, ll z) { if (i->l==i->r) { i->val=z; return; } ll mid=(i->l+i->r)/2; if (y<=mid) { if (!i->lc) i->lc=new node2(y, y); else if (y<i->lc->l || i->lc->r<y) { ll l=i->l, r=mid, m=(l+r)/2; while ((y<=m)^(i->lc->l>m)) { if (y<=m) r=m; else l=m+1; m=(l+r)/2; } node2 *j=new node2(l, r); if (i->lc->l<=m) j->lc=i->lc; else j->rc=i->lc; i->lc=j; } upd2(i->lc, y, z); } else { if (!i->rc) i->rc=new node2(y, y); else if (y<i->rc->l || i->rc->r<y) { ll l=mid+1, r=i->r, m=(l+r)/2; while ((y<=m)^(i->rc->l>m)) { if (y<=m) r=m; else l=m+1; m=(l+r)/2; } node2 *j=new node2(l, r); if (i->rc->l<=m) j->lc=i->rc; else j->rc=i->rc; i->rc=j; } upd2(i->rc, y, z); } i->val=gcd(i->lc?i->lc->val:0, i->rc?i->rc->val:0); } ll qry2(node2 *i, ll ql, ll qr) { if (ql<=i->l && i->r<=qr) return i->val; ll res=0; if (i->lc && i->lc->l<=qr && ql<=i->lc->r) res=gcd(res, qry2(i->lc, ql, qr)); if (i->rc && i->rc->l<=qr && ql<=i->rc->r) res=gcd(res, qry2(i->rc, ql, qr)); return res; } void upd1(node1 *i, ll x, ll y, ll z) { if (i->l==i->r) { if (!i->x) i->x=new node2(0, 1e9); upd2(i->x, y, z); return; } ll mid=(i->l+i->r)/2; if (x<=mid) { if (!i->lc) i->lc=new node1(i->l, mid); upd1(i->lc, x, y, z); } else { if (!i->rc) i->rc=new node1(mid+1, i->r); upd1(i->rc, x, y, z); } if (!i->x) i->x=new node2(0, 1e9); upd2(i->x, y, gcd(i->lc?qry2(i->lc->x, y, y):0, i->rc?qry2(i->rc->x, y, y):0)); } ll qry1(node1 *i, ll ql1, ll qr1, ll ql2, ll qr2) { if (ql1<=i->l && i->r<=qr1) return qry2(i->x, ql2, qr2); ll mid=(i->l+i->r)/2, res=0; if (i->l<=qr1 && ql1<=mid && i->lc) res=gcd(res, qry1(i->lc, ql1, qr1, ql2, qr2)); if (mid<qr1 && ql1<=i->r && i->rc) res=gcd(res, qry1(i->rc, ql1, qr1, ql2, qr2)); return res; } void init(int R, int C) {} void update(int P, int Q, ll K) { upd1(&root, P, Q, K); } ll calculate(int P, int Q, int U, int V) { return qry1(&root, P, U, Q, V); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...