Submission #256427

#TimeUsernameProblemLanguageResultExecution timeMemory
256427A02Game (IOI13_game)C++14
63 / 100
1154 ms256004 KiB
#include "game.h"
#include <vector>
#include <algorithm>
#include <set>
#include <utility>
#include <iostream>

using namespace std;

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;
}


void update_seg_tree(vector<long long> &tree, long long p, long long t){

    long long N = tree.size() / 2;

    tree[p + N] = t;

    for (p = (p + N) / 2; 0 < p; p /= 2){

        tree[p] = gcd2(tree[2 * p], tree[2 * p + 1]);

    }

}

long long query_seg_tree(vector<long long> &tree, long long l, long long r){

    long long N = tree.size() / 2;
    long long total = 0;

    for (l += N, r += N; l < r; l /= 2, r /= 2){

        if (l % 2 == 1){
            total = gcd2(total, tree[l++]);
        }
        if (r % 2 == 1){
            total = gcd2(total, tree[--r]);
        }

    }

    return total;
}

void update_2Dseg_tree(vector<vector<long long> > &tree, long long r, long long c, long long t){

    long long N = tree.size() / 2;

    update_seg_tree(tree[r + N], c, t);

    for (r = (r + N) / 2; 0 < r; r /= 2){

        update_seg_tree(tree[r], c, gcd2(query_seg_tree(tree[2 * r], c, c + 1), query_seg_tree(tree[2 * r + 1], c, c + 1)));

    }

}

long long query_2Dseg_tree(vector<vector<long long> > &tree, long long lr, long long rr, long long lc, long long rc){

    long long N = tree.size() / 2;
    long long total = 0;

    for (lr += N, rr += N; lr < rr; lr /= 2, rr /= 2){

        if (lr % 2 == 1){
            total = gcd2(total, query_seg_tree(tree[lr++], lc, rc));
        }
        if (rr % 2 == 1){
            total = gcd2(total, query_seg_tree(tree[--rr], lc, rc));
        }

    }

    return total;
}

vector<vector<long long> > seg_tree;

void init(int R, int C) {

    seg_tree = vector<vector<long long> > (2 * R, vector<long long> (2 * C, 0));

}

void update(int P, int Q, long long K) {
    //cout << "update: " << P << ' ' << Q << ' ' << K << endl;
    update_2Dseg_tree(seg_tree, P, Q, K);
    //cout << ' ' << query_2Dseg_tree(seg_tree, 0, 1, 0, 3) << endl;
}

long long calculate(int P, int Q, int U, int V) {
    //cout << "calculate: " << P << ' ' << Q << ' '<< U << ' ' << V << endl;
    return query_2Dseg_tree(seg_tree, P, U + 1, Q, V + 1);
}

Compilation message (stderr)

grader.c: In function 'int main()':
grader.c:18:6: warning: variable 'res' set but not used [-Wunused-but-set-variable]
  int res;
      ^~~
#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...