# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1217845 | hossainrasel1042 | Game (IOI13_game) | C++20 | 0 ms | 0 KiB |
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
#define fastio ios_base::sync_with_stdio(false); cin.tie(nullptr);
vector<vector<int>>tree;
vector<vector<int>>st;
int n,m;
void buildy(int nodex,int lx,int rx,int nodey,int ly,int ry){
if(ly==ry){
if(lx==rx){
tree[nodex][nodey]=st[lx][ly];
}else{
tree[nodex][nodey]=gcd(tree[2*nodex][nodey],tree[2*nodex+1][nodey]);
}
return;
}
int mid=(ly+ry)>>1;
buildy(nodex,lx,rx,2*nodey,ly,mid);
buildy(nodex,lx,rx,2*nodey+1,mid+1,ry);
tree[nodex][nodey]=gcd(tree[nodex][2*nodey],tree[nodex][2*nodey+1]);
}
void buildx(int nodex,int lx,int rx){
if(lx==rx){
buildy(nodex,lx,rx,1,0,m-1);
return;
}
int mid=(lx+rx)>>1;
buildx(2*nodex,lx,mid);
buildx(2*nodex+1,mid+1,rx);
buildy(nodex, lx, rx, 1, 0, m - 1);
}
int queryy(int nodex, int nodey, int ly, int ry, int y1, int y2) {
if (y2 < ly || ry < y1) return 0;
if (y1 <= ly && ry <= y2) return tree[nodex][nodey];
int mid = (ly + ry) >> 1;
return gcd(queryy(nodex, 2 * nodey, ly, mid, y1, y2)
, queryy(nodex, 2 * nodey + 1, mid + 1, ry, y1, y2));
}
int queryx(int nodex, int lx, int rx, int x1, int x2, int y1, int y2) {
if (x2 < lx || rx < x1) return 0;
if (x1 <= lx && rx <= x2) return queryy(nodex, 1, 0, m - 1, y1, y2);
int mid = (lx + rx) >> 1;
return gcd(queryx(2 * nodex, lx, mid, x1, x2, y1, y2)
, queryx(2 * nodex + 1, mid + 1, rx, x1, x2, y1, y2));
}
void updatey(int nodex,int xl,int xr,int nodey,int yl,int yr,int x1,int y1,int val){
if(yl==yr){
if(xl==xr){
tree[nodex][nodey]=val;
}else{
tree[nodex][nodey]=gcd(tree[2*nodex][nodey],tree[2*nodex+1][nodey]);
}
return;
}
int mid=(yl+yr)>>1;
if(y1<=mid){
updatey(nodex,xl,xr,2*nodey,yl,mid,x1,y1,val);
}else{
updatey(nodex,xl,xr,2*nodey+1,mid+1,yr,x1,y1,val);
}
tree[nodex][nodey]=gcd(tree[nodex][2*nodey],tree[nodex][2*nodey+1]);
}
void updatex(int nodex,int xl,int xr,int x1,int y1,int val){
if(xl==xr){
updatey(nodex,xl,xr,1,0,m-1,x1,y1,val);
return;
}
int mid=(xl+xr)>>1;
if(x1<=mid){
updatex(2*nodex,xl,mid,x1,y1,val);
}else{
updatex(2*nodex+1,mid+1,xr,x1,y1,val);
}
updatey(nodex,xl,xr,1,0,m-1,x1,y1,val);
}
void solve(){
cin >> n >> m;
st.resize(n, vector<int>(m,0));
tree.resize(4 * n, vector<int>(4 * m));
buildx(1, 0, n - 1);
int q;
cin >> q;
while (q--) {
int type;
cin >> type;
if (type == 2) {
int x1, y1, x2, y2;
cin >> x1 >> y1 >> x2 >> y2;
cout << queryx(1, 0, n - 1, x1, x2, y1, y2) << endl;
} else if (type == 1) {
int x, y, val;
cin >> x >> y >> val;
updatex(1, 0, n - 1, x, y, val);
}
}
}
int32_t main() {
fastio
solve();
return 0;
}