0pts WA 求助(对2个测点),玄关
查看原帖
0pts WA 求助(对2个测点),玄关
574745
littlesnake楼主2024/3/2 13:25
#include <bits/stdc++.h>
#define ll long long
#define NU 22005
#define NQ 250005
using namespace std;
inline void rd(int &x) {
	x = 0; char c = getchar();
	while(c < '0' || c > '9') c = getchar();
	while(c >= '0' && c <= '9') { x = (x << 3) + (x << 1) + (c ^ 48); c = getchar(); }
}
inline void rdll(ll &x) {
	x = 0; char c = getchar();
	while(c < '0' || c > '9') c = getchar();
	while(c >= '0' && c <= '9') { x = (x << 3) + (x << 1) + (c ^ 48); c = getchar(); }
}
int n;
struct query {
	int opt, x1, y1, x2, y2; ll val;
} qry[NU + NQ];
int Valu[NU], _Valu, Valq[NU + (NQ << 1)], _Valq;
inline void unq() {
	std :: sort(Valu + 1, Valu + _Valu + 1);
	_Valu = std :: unique(Valu + 1, Valu + _Valu + 1) - Valu - 1;
	std :: sort(Valq + 1, Valq + _Valq + 1);
	_Valq = std :: unique(Valq + 1, Valq + _Valq + 1) - Valq - 1;
}
inline int idu(int val) {
	return std :: upper_bound(Valu + 1, Valu + _Valu + 1, val) - Valu - 1;
}
inline int idq(int val) {
	return std :: upper_bound(Valq + 1, Valq + _Valq + 1, val) - Valq - 1;
}
inline ll gcd(ll x, ll y) {
	while(x && y) {
		ll tmp = x % y; x = y; y = tmp;
	} return x + y;
}
int _t;
struct node {
	int son[2]; ll val;
} t[NU << 9];
#define lson t[p].son[0], L, mid
#define rson t[p].son[1], mid + 1, R
inline void ins(int &p, int L, int R, int pos, ll val) {
	if(!p) p == ++_t;
	if(L == R) { t[p].val = val; return; }
	int mid = (L + R) >> 1;
	if(pos <= mid) ins(lson, pos, val);
	else ins(rson, pos, val);
	t[p].val = gcd(t[t[p].son[0]].val, t[t[p].son[1]].val);
}
inline void mrg(int &p, int L, int R, int q1, int q2, int pos) {
	if(!p) p == ++_t;
	if(L == R) { t[p].val = gcd(t[q1].val, t[q2].val); return; }
	int mid = (L + R) >> 1;
	if(pos <= mid) mrg(lson, t[q1].son[0], t[q2].son[0], pos);
	else mrg(rson, t[q1].son[1], t[q2].son[1], pos);
	t[p].val = gcd(t[t[p].son[0]].val, t[t[p].son[1]].val);
}
inline ll Cal(int p, int L, int R, int l, int r) {
	if(!p || Valu[L] > r || Valu[R] < l) return 0;
	if(l <= Valu[L] && Valu[R] <= r) return t[p].val;
	int mid = (L + R) >> 1;
	return gcd(Cal(lson, l, r), Cal(rson, l, r));
}
#undef lson
#undef rson
int rt[(NU + (NQ << 1)) << 2];
#define lson p << 1, L, mid
#define rson p << 1 | 1, mid + 1, R
inline void mdf(int p, int L, int R, int pos, int pos2, ll val) {
	if(pos < L || pos > R) return ;
	if(L == R) { ins(rt[p], 1, _Valu, pos2, val); return ; }
	int mid = (L + R) >> 1;
	mdf(lson, pos, pos2, val);
	mdf(rson, pos, pos2, val);
	mrg(rt[p], 1, _Valu, rt[p << 1], rt[p << 1 | 1], pos2);
}
inline ll cal(int p, int L, int R, int l, int r, int l2, int r2) {
	if(L > r || R < l) return 0;
	if(l <= L && R <= r) return Cal(rt[p], 1, _Valu, l2, r2);
	int mid = (L + R) >> 1;
	return gcd(cal(lson, l, r, l2, r2), cal(rson, l, r, l2, r2));
}
#undef lson
#undef rson
int main() {
	rd(n), rd(n), rd(n);
	for(int i = 1; i <= n; i++) {
		rd(qry[i].opt);
		if(qry[i].opt == 1) {
			rd(qry[i].x1), rd(qry[i].y1), rdll(qry[i].val);
			Valu[++_Valu] = qry[i].y1;
			Valq[++_Valq] = qry[i].x1;
		} else {
			rd(qry[i].x1), rd(qry[i].y1), rd(qry[i].x2), rd(qry[i].y2);
			Valq[++_Valq] = qry[i].x1;
			Valq[++_Valq] = qry[i].x2;
		}
	} unq();
	for(int i = 1; i <= n; i++) 
		if(qry[i].opt == 1) mdf(1, 1, _Valq, idq(qry[i].x1), idu(qry[i].y1), qry[i].val);
		else cout << cal(1, 1, _Valq, idq(qry[i].x1), idq(qry[i].x2), qry[i].y1, qry[i].y2) << "\n";
	#define w 0
	return ~~('0') ? (0 ^ w ^ w) : (0 * w * w);
}
2024/3/2 13:25
加载中...