90pts 求卡常
查看原帖
90pts 求卡常
723238
wukaichen888楼主2023/8/10 22:57
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int n,m,t,px,py,flag,id[500005];
ll a[500005];
#define lc k<<1
#define rc k<<1|1
#define ls lc,l,mid
#define rs rc,mid+1,r
struct zhx{
	vector<ll>tree;
	inline void pushup(int k){tree[k]=__gcd(tree[lc],tree[rc]);}
	inline void change2(int x,ll d){
		if(x>m) return ;
		x=id[x];
		tree[x]+=d;
		x>>=1;
		while(x){
			pushup(x);
			x>>=1;
		}
	}
	inline ll query2(int k,int l,int r,int x,int y){
		if(x>y) return 0ll;
		if(x<=l&&r<=y) return tree[k];
		int mid=l+r>>1;
		if(x<=mid&&mid<y) return __gcd(query2(ls,x,y),query2(rs,x,y));
		if(x<=mid) return query2(ls,x,y);
		return query2(rs,x,y);
	}
	vector<ll>c;
	inline void change1(int x,ll d){for(;x<=m;x+=(x&(-x)))c[x]+=d;}
	inline ll query1(int x){ll res=0;for(;x;x-=(x&(-x)))res+=c[x];return res;}
}qwq[709];
char *p1,*p2,buf[10000005];
#define nc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,10000000,stdin),p1==p2)?EOF:*p1++)
ll read(){
    ll x=0,f=1;char ch=nc();
    while(ch<48||ch>57){if(ch=='-')f=-1;ch=nc();}
    while(ch>=48&&ch<=57)x=x*10+ch-48,ch=nc();
   	return x*f;
}
void pre(int k,int l,int r){
	if(l==r){
		id[l]=k;
		return ;
	}
	int mid=l+r>>1;
	pre(ls);
	pre(rs);
}
signed main(){
	n=read(),m=read(),px=read(),py=read(),t=read();
	if(n>m){
		flag=1;
		swap(n,m);
	}
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m*4+5;j++)
			qwq[i].tree.push_back(0ll);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m+5;j++)
			qwq[i].c.push_back(0ll);
	pre(1,1,m);
	if(flag){
		for(int i=1;i<=m;i++){
			ll x;
			for(int j=1;j<=n;j++){
				x=read();
				qwq[j].change1(i,x-a[j]);
				qwq[j].change2(i,x-a[j]);
				a[j]=x;
			}
		}
	}
	else{
		for(int i=1;i<=n;i++){
			ll las=0,x;
			for(int j=1;j<=m;j++){
				x=read();
				qwq[i].change1(j,x-las);
				qwq[i].change2(j,x-las);
				las=x;
			}
		}		
	}
	int op,x1,x2,y1,y2;
	ll res,v;
	while(t--){
		op=read();
		if(!op){
			x1=read(),y1=read(),x2=read(),y2=read();
			x1=px-x1,x2=px+x2;
			y1=py-y1,y2=py+y2;
			if(flag) swap(x1,y1),swap(x2,y2);
			res=0;
			for(int i=x1;i<=x2;i++)
				res=__gcd(res,__gcd(qwq[i].query1(y1),qwq[i].query2(1,1,m,y1+1,y2)));
			res=abs(res);
			printf("%lld\n",res);
		}
		else{
			x1=read(),y1=read(),x2=read(),y2=read(),v=read();
			if(flag) swap(x1,y1),swap(x2,y2);
			for(int i=x1;i<=x2;i++)
				qwq[i].change1(y1,v),qwq[i].change1(y2+1,-v),qwq[i].change2(y1,v),qwq[i].change2(y2+1,-v);
		}
	}
	return 0;
}

2023/8/10 22:57
加载中...