Submission #1199376

#TimeUsernameProblemLanguageResultExecution timeMemory
1199376TimDeeGame (IOI13_game)C++20
80 / 100
3015 ms162784 KiB
#include "game.h" #include <bits/stdc++.h> using namespace std; #define forn(i,n) for(int i=0; i<n; ++i) #define pb push_back #define all(x) x.begin(), x.end() #define pi pair<int,int> #define f first #define s second using ll = long long; struct node { int l=-1,r=-1; ll s=0; }; struct node2d { int root=-1,l=-1,r=-1; }; int nxt=1, nxt2d=1; const int sz=1<<30; const int tsz=1e7; vector<node> t(tsz); node2d st[(int)30e4]; ll query(int v, int l, int r, int lx, int rx) { if (v==-1) return 0; if (rx<=l || r<=lx) return 0; if (lx<=l && r<=rx) return t[v].s; int m=(l+r)>>1; ll lq = query(t[v].l,l,m,lx,rx); ll rq = query(t[v].r,m,r,lx,rx); return __gcd(lq,rq); } ll query2d(int v, int l, int r, int lx, int rx, int ly, int ry) { if (v==-1) return 0; if (rx<=l || r<=lx) return 0; if (lx<=l && r<=rx) { return query(st[v].root,0,sz,ly,ry); } int m=(l+r)>>1; ll lq = query2d(st[v].l,l,m,lx,rx,ly,ry); ll rq = query2d(st[v].r,m,r,lx,rx,ly,ry); return __gcd(lq,rq); } ll query2d(int a, int b, int l, int r) { return query2d(0,0,sz,a,b,l,r); } #define set sett void set(int v, int l, int r, int i, ll x) { if (r-l==1) { t[v].s=x; return; } int m=(l+r)>>1; if (i<m) { if (t[v].l==-1) t[v].l=nxt++; set(t[v].l,l,m,i,x); } else { if (t[v].r==-1) t[v].r=nxt++; set(t[v].r,m,r,i,x); } t[v].s=__gcd( (t[v].l==-1)?0:t[t[v].l].s, (t[v].r==-1)?0:t[t[v].r].s ); } void set2d(int v, int l, int r, int a, int b, ll x) { if (st[v].root==-1) st[v].root=nxt++; if (r-l==1) { set(st[v].root,0,sz,b,x); return; } int m=(l+r)>>1; ll y; if (a<m) { if (st[v].l==-1) st[v].l=nxt2d++; set2d(st[v].l,l,m,a,b,x); x=query2d(st[v].l,l,m,l,m,b,b+1); y=query2d(st[v].r,m,r,m,r,b,b+1); } else { if (st[v].r==-1) st[v].r=nxt2d++; set2d(st[v].r,m,r,a,b,x); x=query2d(st[v].l,l,m,l,m,b,b+1); y=query2d(st[v].r,m,r,m,r,b,b+1); } set(st[v].root,0,sz,b,__gcd(x,y)); } void set2d(int a, int b, ll x) { set2d(0,0,sz,a,b,x); } void init(int n, int m) { } void update(int p, int q, ll k) { set2d(p,q,k); } ll calculate(int p, int q, int u, int v) { return query2d(p,u+1,q,v+1); }
#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...