栈与公约数

栈与公约数

区间修改,区间查询

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);
        }
    }
}
posted @ 2023-03-13 17:16  347Foricher  阅读(81)  评论(0)    收藏  举报