Jys

#pragma GCC optimize("Ofast")
#pragma GCC target("sse2")
#include <bits/stdc++.h>
#define ls(x) (x << 1)
#define rs(x) (x << 1 | 1)
#define mid (l + r >> 1)

using namespace std;
const int U = 100, N = 200000;


int tr[(N << 2) + 5][U + 5];
int n, a, b, x, y;
int w[N + 5];


void Build(int p, int l, int r)
{
    for (int i = 1; i <= U; i++) tr[p][i] = i;
    if (l == r) return;
    Build(ls(p), l, mid), Build(rs(p), mid + 1, r);
}


void Psd(int p, int l, int r)
{
    if (l == r) return;
    for (int i = 1; i <= U; i++)
        tr[ls(p)][i] = tr[p][tr[ls(p)][i]],
        tr[rs(p)][i] = tr[p][tr[rs(p)][i]];
    for (int i = 1; i <= U; i++) tr[p][i] = i;
}


void Modify(int p, int l, int r)
{
    if (l >= a && r <= b) 
    {
        for (int i = 1; i <= U; i++) if (tr[p][i] == x) tr[p][i] = y;
        return;
    }
    Psd(p, l, r);
    if (a <= mid) Modify(ls(p), l, mid);
    if (b > mid) Modify(rs(p), mid + 1, r);
}


void Print(int p, int l, int r)
{
    if (l == r) return (void)printf("%d ", tr[p][w[l]]);
    Psd(p, l, r), Print(ls(p), l, mid), Print(rs(p), mid + 1, r);
}


int main()
{
    scanf("%d", &n);
    for (int i = 1; i <= n; i++) scanf("%d", &w[i]);
    Build(1, 1, n);
    int q;
    for (scanf("%d", &q); q--;) scanf("%d%d%d%d", &a, &b, &x, &y), Modify(1, 1, n);
    return Print(1, 1, n), 0;
}
原文地址:https://www.cnblogs.com/oply/p/12850182.html