#include <bits/stdc++.h>
//#include "game.h"
using namespace std;
vector<vector<long long> >seg;
int gg, ggg;
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 init(int r, int c) {
r *= 2;
c *= 2;
gg = r;
ggg = c;
for(long long i = 0; i <= r * 2; i++) {
vector<long long> temp;
for(long long j = 0; j <= c * 2; j++) {
temp.push_back(0);
}
seg.push_back(temp);
}
}
void updateY(long long l, long long r, long long pos, long long xpos, long long qcol, long long qval) {
//cout << "UpdateY " << l << " " << r << " " << qcol << " " << xpos << " " << pos << endl;
if(l == r) {
seg[xpos][pos] = qval;
//cout << seg[xpos][pos] << endl;
return;
}
else {
long long mid = (l + r) / 2;
if(qcol <= mid)
updateY(l, mid, pos * 2, xpos, qcol, qval);
else
updateY(mid + 1, r, pos * 2 + 1, xpos, qcol, qval);
seg[xpos][pos] = gcd2(seg[xpos][pos * 2], seg[xpos][pos * 2 + 1]);
}
}
void updateX(long long l, long long r, long long pos, long long qrow, long long qcol, long long val, long long col) {
//cout << "UpdateX " << l << " " << r << " " << qrow << " " << pos << endl;
if(l == r) {
updateY(1, col, 1, pos, qcol, val);
return;
}
/*else {
long long mid = (l + r) / 2;
if(qrow <= mid)
updateX(l, mid, pos * 2, qrow, qcol, val, col);
else
updateX(mid + 1, r, pos * 2 + 1, qrow, qcol, val, col);
}*/
for(long long i = 0; i < seg[pos].size(); i++) {
seg[pos][i] = gcd2(seg[pos * 2][i], seg[pos * 2 + 1][i]);
}
}
long long queryY(long long l, long long r, long long pos, long long leftcol, long long rightcol, long long xpos) {
if(l > rightcol || r < leftcol)
return 0;
if(leftcol <= l && r <= rightcol)
return seg[xpos][pos];
long long mid = (l + r) / 2;
return gcd2(queryY(l, mid, pos * 2, leftcol, rightcol, xpos), queryY(mid + 1, r, pos * 2 + 1, leftcol, rightcol, xpos));
}
long long queryX(long long l, long long r, long long pos, long long leftrow, long long leftcol, long long rightrow, long long rightcol, long long y) {
if(l > rightrow || r < leftrow)
return 0;
if(leftrow <= l && r <= rightrow)
return queryY(1, y, 1, leftcol, rightcol, pos);
long long mid = (l + r) / 2;
return gcd2(queryX(l, mid, pos * 2, leftrow, leftcol, rightrow, rightcol, y), queryX(mid + 1, r, pos * 2 + 1, leftrow, leftcol, rightrow, rightcol, y));
}
int x = gg, y = ggg, queries;
void update(int r, int c, long long val) {
r++; c++;
updateX(1, x, 1, r, c, val, y);
}
long long calculate(int r1, int c1, int r2, int c2) {
r1++; c1++;
r2++; c2++;
return queryX(1, x, 1, r1, c1, r2, c2, y);
}
int main() {
cin >> x >> y >> queries;
init(x, y);
while(queries--) {
// for(long long i = 1; i <= 8; i++) {
// for(long long j = 1; j <= 8; j++) {
// cout << seg[i][j] << " ";
// }
// cout << endl;
// }
int com;
cin >> com;
if(com == 1) {
int r, c;
long long val;
cin >> r >> c >> val;
update(r, c, val);
}
else {
int a, b, c, d;
cin >> a >> b >> c >> d;
cout << calculate(a, b, c, d) << "\n";
}
}
}
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;
^~~
game.cpp: In function 'void updateX(long long int, long long int, long long int, long long int, long long int, long long int, long long int)':
game.cpp:63:28: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for(long long i = 0; i < seg[pos].size(); i++) {
~~^~~~~~~~~~~~~~~~~
/tmp/ccorkvbB.o: In function `main':
game.cpp:(.text.startup+0x0): multiple definition of `main'
/tmp/ccenWoWI.o:grader.c:(.text.startup+0x0): first defined here
/tmp/ccenWoWI.o: In function `main':
grader.c:(.text.startup+0x5d): undefined reference to `init'
grader.c:(.text.startup+0xb8): undefined reference to `calculate'
grader.c:(.text.startup+0x122): undefined reference to `update'
collect2: error: ld returned 1 exit status