Submission #399570

#TimeUsernameProblemLanguageResultExecution timeMemory
399570cfalasGame (IOI13_game)C++14
63 / 100
1626 ms256004 KiB
#include "game.h" #include<bits/stdc++.h> using namespace std; #define mp make_pair #define INF 10000000 #define MOD 1000000007 #define MID ((l+r)/2) #define HASHMOD 2305843009213693951 #define ll long long #define ull unsigned long long #define F first #define S second typedef pair<ll, ll> ii; typedef pair<ii, int> iii; typedef vector<ll> vi; typedef vector<ii> vii; typedef map<int, int> mii; #define EPS 1e-6 #define FOR(i,n) for(int i=0;i<((int)(n));i++) #define FORi(i,a,b) for(int i=((int)(a));i<((int)(b));i++) #define FOA(v, a) for(auto v : a) int t, n; vi a, b; static int M; //static map<int, map<ii, int> > mapper; long long gcd(long long X, long long Y) { //return X + Y; long long tmp; while (X != Y && Y != 0) { tmp = X; X = Y; Y = tmp % Y; } return X; } template<typename Q> struct seg_tree_2d{ template<typename T> struct seg_tree{ T val=0; seg_tree* left=nullptr; seg_tree* right=nullptr; T RAND_VALUE=0; inline void create_children(){ if(left==nullptr) left= new seg_tree(); if(right==nullptr) right = new seg_tree(); } void print(int l=0, int r=M-1){ cout<<"("<<l<<" "<<r<<": "<<val<<") "; if(left!=nullptr) left->print(l, MID); if(right!=nullptr) left->print(MID+1, r); } void update(int x, T val_n, int l=0, int r=M-1){ if(x==l && r==x) val = val_n; else if(x<l || r<x) return; else{ if(x<=MID){ if(left==nullptr) left = new seg_tree(); left->update(x,val_n,l,MID); } else{ if(right==nullptr) right = new seg_tree(); right->update(x,val_n,MID+1,r); } T g = 0; if(left!=nullptr) g = gcd(g, left->val); if(right!=nullptr) g = gcd(g, right->val); val = g; } } T query(int rl, int rr, int l=0, int r=M-1){ if(rl<=l && r<=rr) return val; else if(rl>r || l>rr) return RAND_VALUE; else{ T g = 0; if(left!=nullptr) g = gcd(g, left->query(rl,rr,l,MID)); if(right!=nullptr) g = gcd(g, right->query(rl,rr,MID+1,r)); return g; } } }; struct node{ seg_tree<Q> val; int left=-1; int right=-1; node() {left=-1, right=-1;} }; vector<node> seg2d; static inline int N; Q RAND_VALUE_2d=0; seg_tree_2d(int n){N=n, seg2d.assign(1, node());} void print(int l=0, int r=N-1, int ind=0){ cout<<"L R "<<l<<" "<<r<<" "<<ind<<endl; //seg2d[ind].val->print(); cout<<endl; if(seg2d[ind].left!=-1) print(l, MID, seg2d[ind].left); if(seg2d[ind].right!=-1) print(MID+1, r, seg2d[ind].right); } inline void create_children(int ind){ if(seg2d[ind].left==-1){ seg2d[ind].left=seg2d.size(); seg2d.push_back(node()); } if(seg2d[ind].right==-1){ seg2d[ind].right=seg2d.size(); seg2d.push_back(node()); } } void update(int y, int x, Q val, int l=0, int r=N-1, int ind=0){ if(y==l && y==r) seg2d[ind].val.update(x, val); else if(y<l || r<y) return; else{ create_children(ind); update(y,x,val,l,MID,seg2d[ind].left); update(y,x,val,MID+1,r,seg2d[ind].right); Q g = seg2d[seg2d[ind].left].val.query(x, x); g = gcd(g, seg2d[seg2d[ind].right].val.query(x, x)); if(seg2d[ind].val.query(x, x)!= g){ seg2d[ind].val.update(x, g); } //merge(seg2d[ind], seg2d[seg2d[ind].left], seg2d[seg2d[ind].right], ind); } } Q query(int rl, int rr, int xl, int xr, int l=0, int r=N-1, int ind=0){ if(rl<=l && r<=rr) return seg2d[ind].val.query(xl, xr); else if(rl>r || l>rr) return RAND_VALUE_2d; else{ create_children(ind); return gcd(query(rl, rr, xl, xr, l, MID, seg2d[ind].left), query(rl,rr,xl, xr, MID+1,r,seg2d[ind].right)); } } }; seg_tree_2d<ll> seg(n); void init(int R, int C) { M = R; seg.N = C; } void update(int P, int Q, long long K) { seg.update(Q,P,K); } long long calculate(int P, int Q, int U, int V) { return seg.query(Q,V,P,U); }

Compilation message (stderr)

game.cpp:103:9: warning: inline variables are only available with '-std=c++17' or '-std=gnu++17'
  103 |  static inline int N;
      |         ^~~~~~
#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...