답안 #27240

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
27240 2017-07-11T11:49:32 Z tlwpdus 게임 (IOI13_game) C++11
0 / 100
0 ms 2208 KB
#include "game.h"
#include <bits/stdc++.h>

typedef long long ll;

ll gcd2(ll X, ll Y) {
    ll tmp;
    while (X != Y && Y != 0) {
        tmp = X;
        X = Y;
        Y = tmp % Y;
    }
    return X;
}

ll R, C;
int x, y; ll val;
int sx, sy, ex, ey;

struct node1 {
    ll val;
    node1 *l, *r;
    node1() {val = 0; l = r = NULL;}
    void mer() {val = gcd2(l?l->val:0,r?r->val:0);}
    void upd(int s = 0, int e = C-1) {
        if (s==e) {
            val = ::val;
            return;
        }
        int m = (s+e)>>1;
        if (y<=m) {
            if (!l) l = new node1();
            l->upd(s,m);
        }
        else {
            if (!r) r = new node1();
            r->upd(m+1,e);
        }
        mer();
    }
    void upd(node1 *a, node1 *b, int s = 0, int e = C-1) {
        if (s==e) {
            val = gcd2(a?a->val:0,b?b->val:0);
            return;
        }
        int m = (s+e)>>1;
        if (y<=m) {
            if (!l) l = new node1();
            l->upd(a?a->l:0,b?b->l:0,s,m);
        }
        else {
            if (!r) r = new node1();
            r->upd(a?a->r:0,b?b->r:0,m+1,e);
        }
        mer();
    }
    ll getv(int s = 0, int e = C-1) {
        if (e<sy||ey<s) return 0;
        if (sy<=s&&e<=ey) return val;
        int m = (s+e)>>1;
        return gcd2(l?l->getv(s,m):0,r?r->getv(m+1,e):0);
    }
};

struct node2 {
    node1 *head;
    node2 *l, *r;
    node2() {head = new node1(); l = r = NULL;}
    void mer() {
        head->upd(l?l->head:0,r?r->head:0);
    }
    void upd(int s = 0, int e = R-1) {
        head->upd();
        if (s==e) return;
        int m = (s+e)>>1;
        if (x<=m) {
            if (!l) l = new node2();
            l -> upd(s,m);
        }
        else {
            if (!r) r = new node2();
            r -> upd(m+1,e);
        }
    }
    ll getv(int s = 0, int e = R-1) {
        if (e<sx||ex<s) return 0;
        if (sx<=s&&e<=ex) return head->getv();
        int m = (s+e)>>1;
        return gcd2(l?l->getv(s,m):0,r?r->getv(m+1,e):0);
    }
} *tree;

void upd(int x, int y, ll val) {
    ::x = x; ::y = y; ::val = val;
    tree->upd();
}

ll calc(int sx, int sy, int ex, int ey) {
    ::sx=sx;::ex=ex;::sy=sy;::ey=ey;
    return tree->getv();
}

void init(int R, int C) {
    ::R = R; ::C = C;
    tree = new node2();
}

void update(int P, int Q, ll K) {
    upd(P,Q,K);
}

ll calculate(int P, int Q, int U, int V) {
    return calc(P,Q,U,V);
}

Compilation message

grader.c: In function 'int main()':
grader.c:18:6: warning: variable 'res' set but not used [-Wunused-but-set-variable]
  int res;
      ^
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 2076 KB Output is correct
2 Incorrect 0 ms 2208 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 2076 KB Output is correct
2 Incorrect 0 ms 2076 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 2076 KB Output is correct
2 Incorrect 0 ms 2208 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 2076 KB Output is correct
2 Incorrect 0 ms 2208 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 2076 KB Output is correct
2 Incorrect 0 ms 2208 KB Output isn't correct
3 Halted 0 ms 0 KB -