栈与公约数
栈与公约数

区间修改,区间查询
int T;
int n, q, op, num;
struct Node
{
int l, r;
int sum, d; // lazy, 区间gcd
} tr[N << 2];
int gcd(int a, int b)
{
return b == 0 ? a : gcd(b, a % b);
}
void pushup(Node &u, Node &l, Node &r)
{
u.d = gcd(l.d, r.d);
}
void pushup(int u)
{
pushup(tr[u], tr[u << 1], tr[u << 1 | 1]);
}
void pushdown(int u)
{
if (tr[u].sum)
{
tr[u << 1].sum = tr[u << 1].d = tr[u].sum;
tr[u << 1 | 1].sum = tr[u << 1 | 1].d = tr[u].sum;
tr[u].sum = 0;
}
}
void build(int u, int l, int r)
{
if (l == r)
{
tr[u] = {l, r, 0, 0};
return;
}
else
{
tr[u].l = l, tr[u].r = r;
int mid = (l + r) >> 1;
build(u << 1, l, mid), build(u << 1 | 1, mid + 1, r);
pushup(u);
}
}
void modify(int u, int l, int r, int v)
{
if (tr[u].l >= l && tr[u].r <= r)
{
tr[u] = {tr[u].l, tr[u].r, v, v};
}
else
{
pushdown(u);
int mid = (tr[u].l + tr[u].r) >> 1;
if (l <= mid)
modify(u << 1, l, r, v);
if (r > mid)
modify(u << 1 | 1, l, r, v);
pushup(u);
}
}
int query(int u, int l, int r)
{
if (tr[u].l >= l && tr[u].r <= r)
return tr[u].d;
pushdown(u);
int mid = (tr[u].l + tr[u].r) >> 1;
int ans = 0;
if (l <= mid)
ans = gcd(ans, query(u << 1, l, r));
if (r > mid)
ans = gcd(ans, query(u << 1 | 1, l, r));
return ans;
}
void solve()
{
cin >> n;
build(1, 1, n);
int pos = 0;
for (int i = 1; i <= n; i++)
{
cin >> op;
if (op == 1)
{
cin >> num;
pos++;
modify(1, pos, pos, num);
}
else if (op == 2)
{
pos--;
}
else if (op == 3)
{
cout << query(1, pos, pos) << endl;
}
else
{
cin >> num;
int t = query(1, pos - num + 1, pos);
modify(1, pos - num + 1, pos, t);
}
}
}

浙公网安备 33010602011771号