Submission #1032110

#TimeUsernameProblemLanguageResultExecution timeMemory
1032110noyancanturkGame (IOI13_game)C++17
80 / 100
1551 ms256000 KiB
#include "game.h" long long gcd2(long long X, long long Y) { long long tmp; while (X != Y && Y != 0) { tmp = X; X = Y; Y = tmp % Y; } return X; } #include<iostream> struct Nd{ long long val=0; int ch[2]{0,0}; }tree[19800000]; int nx=1; int L,R; long long ANS; int n,m; int P; long long VAL; struct segtree { int root; void update(int l,int r,int&node){ if(!node){ node=nx++; } if(l==r){ tree[node].val=VAL; return; } int mid=(l+r)>>1; if(P<=mid){ update(l,mid,tree[node].ch[0]); }else{ update(mid+1,r,tree[node].ch[1]); } tree[node].val=gcd2(tree[tree[node].ch[0]].val,tree[tree[node].ch[1]].val); } void update(int p,long long val){ P=p; update(0,m-1,root); } void insert(int l,int r,int&node,int node1,int node2){ if(!node){ node=nx++; } tree[node].val=gcd2(tree[node1].val,tree[node2].val); if(l==r)return; int mid=(l+r)>>1; if(P<=mid){ insert(l,mid,tree[node].ch[0],tree[node1].ch[0],tree[node2].ch[0]); }else{ insert(mid+1,r,tree[node].ch[1],tree[node1].ch[1],tree[node2].ch[1]); } } void insert(int p,int node1,int node2){ P=p; insert(0,m-1,root,node1,node2); } void query(int l,int r,int node){ if(L<=l&r<=R){ ANS=gcd2(ANS,tree[node].val); return; } if(r<L||R<l)return; int mid=(l+r)>>1; if(tree[node].ch[0])query(l,mid,tree[node].ch[0]); if(tree[node].ch[1])query(mid+1,r,tree[node].ch[1]); } void query(int l,int r){ L=l,R=r; query(0,m-1,root); } }; struct { struct { segtree sst; int ch[2]{0,0}; }subtree[1000000]; int nxx=1; void init(int N,int M){ n=N,m=M; } int P1,P2; void update(int l,int r,int&node){ if(!node){ node=++nxx; } if(l==r){ subtree[node].sst.update(P2,VAL); return; } int mid=(l+r)>>1; if(P1<=mid){ update(l,mid,subtree[node].ch[0]); }else{ update(mid+1,r,subtree[node].ch[1]); } subtree[node].sst.insert(P2,subtree[subtree[node].ch[0]].sst.root,subtree[subtree[node].ch[1]].sst.root); } void update(int p1,int p2,long long val){ P1=p1,P2=p2,VAL=val; int root=1; update(0,n-1,root); } int L1,R1,L2,R2; void query(int l,int r,int node){ if(L1<=l&&r<=R1){ subtree[node].sst.query(L2,R2); return; } if(r<L1||R1<l)return; int mid=(l+r)>>1; if(subtree[node].ch[0])query(l,mid,subtree[node].ch[0]); if(subtree[node].ch[1])query(mid+1,r,subtree[node].ch[1]); } long long query(int l1,int r1,int l2,int r2){ L1=l1,R1=r1,L2=l2,R2=r2; ANS=0; query(0,n-1,1); return ANS; } }st; void init(int R, int C) { st.init(R,C); } void update(int P, int Q, long long K) { st.update(P,Q,K); } long long calculate(int P, int Q, int U, int V) { long long val=st.query(P,U,Q,V); return val; }

Compilation message (stderr)

game.cpp: In member function 'void segtree::query(int, int, int)':
game.cpp:64:13: warning: suggest parentheses around comparison in operand of '&' [-Wparentheses]
   64 |         if(L<=l&r<=R){
      |            ~^~~
#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...