46822023-03-31 08:47:00gortomiLegkisebb nem oszthatócpp17Elfogadva 100/1001.585s75600 KiB
#include <bits/stdc++.h>
using namespace std;
vector<vector<int> > g, par;
int tim = 0;
vector<int> l, r, d;
void dfs(int n, int p)
{
    par[n][0] = p;
    d[n] = d[p] + 1;
    l[n] = tim++;
    for(int i = 1; i <= 19; i++)
    {
        par[n][i] = par[par[n][i - 1]][i - 1];
    }
    for(auto x : g[n]) if(x != p) dfs(x, n);
    r[n] = tim++;
}
struct val
{
    int l, r, ind, lca;
};
bool comp(val a, val b)
{
    return a.l / 350 < b.l / 350 || (a.l / 350 == b.l / 350 && a.r < b.r);
}
int calc(int a, int b)
{
    if(d[a] < d[b]) swap(a, b);
    int v = d[a] - d[b];
    for(int i = 0; i <= 19; i++)
    {
        if((v >> i) & 1) a = par[a][i];
    }
    for(int i = 19; i >= 0; i--)
    {
        if(par[a][i] != par[b][i])
        {
            a = par[a][i];
            b = par[b][i];
        }
    }
    return par[a][0];
}
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    int n;
    cin >> n;
    vector<int> prim;
    vector<bool> ip(2 * 1e6 + 1, 1);
    vector<int> pl(2 * 1e6 + 1);
    g.resize(n + 1);
    d.resize(n + 1);
    l.resize(n + 1);
    r.resize(n + 1);
    par.resize(n + 1, vector<int>(20));
    for(int i = 2; i <= 2 * 1e6; i++)
    {
        if(ip[i])
        {
            pl[i] = prim.size();
            prim.push_back(i);
            for(int j = 2 * i; j <= 2 * 1e6; j += i)
            {
                ip[j] = 0;
            }
        }
    }
    vector<int> v(n + 1, 2 * 1e6 + 1);
    for(int i = 1; i <= n; i++)
    {
        int x;
        cin >> x;
        if(ip[x]) v[i] = pl[x];
    }
    for(int i = 0; i < n - 1; i++)
    {
        int x, y;
        cin >> x >> y;
        g[x].push_back(y);
        g[y].push_back(x);
    }
    dfs(1, 1);
    vector<int> path(2 * n);
    for(int i = 1; i <= n; i++)
    {
        path[l[i]] = i;
        path[r[i]] = i;
    }
    int q;
    cin >> q;
    vector<val> que(q + 1);
    que[0] = {0, -1, 0, 0};
    vector<int> ans(q);
    for(int i = 1; i <= q; i++)
    {
        int x, y;
        cin >> x >> y;
        if(l[x] < l[y] && r[x] < r[y])
        {
            que[i].l = r[x];
            que[i].r = l[y];
            que[i].lca = calc(x, y);
        }
        else if(l[x] > l[y] && r[x] > r[y])
        {
            que[i].l = r[y];
            que[i].r = l[x];
            que[i].lca = calc(x, y);
        }
        else
        {
            que[i].l = l[x];
            que[i].r = l[y];
            if(que[i].l > que[i].r) swap(que[i].l, que[i].r);
            que[i].lca = 0;
        }
        que[i].ind = i - 1;
    }
    sort(que.begin(), que.end(), comp);
    const int b = 350;
    vector<int> sq(b);
    vector<int> db(n + 1);
    vector<bool> act(n + 1);
    for(int i = 1; i <= q; i++)
    {
        for(int j = que[i - 1].l - 1; j >= que[i].l; j--)
        {
            int y = path[j];
            int x = v[y];
            if(x > n) continue;
            if(!act[y])
            {
                act[y] = 1;
                db[x]++;
                if(db[x] == 1) sq[x / b]++;
            }
            else
            {
                act[y] = 0;
                db[x]--;
                if(db[x] == 0) sq[x / b]--;
            }
        }
        for(int j = que[i - 1].r + 1; j <= que[i].r; j++)
        {
            int y = path[j];
            int x = v[y];
            if(x > n) continue;
            if(!act[y])
            {
                act[y] = 1;
                db[x]++;
                if(db[x] == 1) sq[x / b]++;
            }
            else
            {
                act[y] = 0;
                db[x]--;
                if(db[x] == 0) sq[x / b]--;
            }
        }
        for(int j = que[i - 1].l; j <= que[i].l - 1; j++)
        {
            int y = path[j];
            int x = v[y];
            if(x > n) continue;
            if(!act[y])
            {
                act[y] = 1;
                db[x]++;
                if(db[x] == 1) sq[x / b]++;
            }
            else
            {
                act[y] = 0;
                db[x]--;
                if(db[x] == 0) sq[x / b]--;
            }
        }
        for(int j = que[i - 1].r; j >= que[i].r + 1; j--)
        {
            int y = path[j];
            int x = v[y];
            if(x > n) continue;
            if(!act[y])
            {
                act[y] = 1;
                db[x]++;
                if(db[x] == 1) sq[x / b]++;
            }
            else
            {
                act[y] = 0;
                db[x]--;
                if(db[x] == 0) sq[x / b]--;
            }
        }
        int x = v[que[i].lca];
        if(x <= n)
        {
            db[x]++;
            if(db[x] == 1) sq[x / b]++;
        }
        for(int j = 0; j < b; j++)
        {
            if(sq[j] < b)
            {
                for(int k = 0; k < b; k++)
                {
                    if(db[j * b + k] == 0)
                    {
                        ans[que[i].ind] = j * b + k;
                        break;
                    }
                }
                break;
            }
        }
        if(x <= n)
        {
            db[x]--;
            if(db[x] == 0) sq[x / b]--;
        }
    }
    for(auto x : ans) cout << prim[x] << "\n";
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
subtask10/0
1Elfogadva35ms20048 KiB
subtask25/5
2Elfogadva35ms20428 KiB
3Elfogadva35ms20672 KiB
4Elfogadva35ms20604 KiB
5Elfogadva35ms20612 KiB
6Elfogadva35ms20820 KiB
7Elfogadva35ms21232 KiB
8Elfogadva37ms21500 KiB
9Elfogadva37ms21448 KiB
10Elfogadva37ms21760 KiB
11Elfogadva37ms21916 KiB
subtask35/5
12Elfogadva35ms21828 KiB
13Elfogadva34ms22076 KiB
14Elfogadva34ms21964 KiB
15Elfogadva35ms22064 KiB
16Elfogadva37ms22336 KiB
17Elfogadva37ms22276 KiB
18Elfogadva37ms22588 KiB
19Elfogadva35ms22816 KiB
20Elfogadva35ms22872 KiB
21Elfogadva37ms22832 KiB
subtask410/10
22Elfogadva56ms26576 KiB
23Elfogadva166ms31684 KiB
24Elfogadva280ms50860 KiB
25Elfogadva398ms65456 KiB
26Elfogadva449ms72532 KiB
27Elfogadva476ms71908 KiB
subtask510/10
28Elfogadva68ms26316 KiB
29Elfogadva196ms30840 KiB
30Elfogadva635ms48492 KiB
31Elfogadva1.281s61428 KiB
32Elfogadva1.578s66192 KiB
33Elfogadva1.585s66196 KiB
subtask610/10
34Elfogadva37ms23476 KiB
35Elfogadva52ms27248 KiB
36Elfogadva118ms35648 KiB
37Elfogadva243ms51684 KiB
38Elfogadva324ms67864 KiB
39Elfogadva439ms71264 KiB
40Elfogadva342ms74840 KiB
41Elfogadva384ms71692 KiB
subtask715/15
42Elfogadva35ms23620 KiB
43Elfogadva54ms26776 KiB
44Elfogadva127ms34492 KiB
45Elfogadva298ms48496 KiB
46Elfogadva513ms62036 KiB
47Elfogadva602ms66452 KiB
48Elfogadva606ms66560 KiB
49Elfogadva600ms66448 KiB
50Elfogadva648ms66460 KiB
51Elfogadva171ms65064 KiB
52Elfogadva234ms57708 KiB
53Elfogadva229ms63676 KiB
54Elfogadva164ms65152 KiB
55Elfogadva250ms57824 KiB
56Elfogadva1.2s57728 KiB
subtask820/20
57Elfogadva56ms27336 KiB
58Elfogadva103ms34960 KiB
59Elfogadva204ms42492 KiB
60Elfogadva326ms53552 KiB
61Elfogadva361ms72480 KiB
62Elfogadva356ms74928 KiB
63Elfogadva500ms71684 KiB
64Elfogadva474ms72284 KiB
65Elfogadva216ms75600 KiB
66Elfogadva216ms75572 KiB
subtask925/25
67Elfogadva61ms26844 KiB
68Elfogadva119ms33320 KiB
69Elfogadva232ms40336 KiB
70Elfogadva680ms49184 KiB
71Elfogadva606ms66016 KiB
72Elfogadva625ms66452 KiB
73Elfogadva1.231s66452 KiB
74Elfogadva884ms66624 KiB
75Elfogadva754ms66684 KiB
76Elfogadva890ms66504 KiB
77Elfogadva987ms66592 KiB
78Elfogadva796ms66452 KiB
79Elfogadva995ms66444 KiB
80Elfogadva437ms70116 KiB
81Elfogadva470ms70108 KiB
82Elfogadva240ms75436 KiB
83Elfogadva970ms71264 KiB