4631 2023. 03. 30 13:12:59 gortomi Legkisebb nem osztható cpp17 Hibás válasz 45/100 1.504s 42072 KiB
#include <bits/stdc++.h>
using namespace std;
vector<vector<int> > g;
int tim = 0;
vector<int> l, r;
void dfs(int n, int p)
{
    l[n] = tim++;
    for(auto x : g[n]) if(x != p) dfs(x, n);
    r[n] = tim++;
}
struct val
{
    int l, r, ind;
};
bool comp(val a, val b)
{
    return a.l / 350 < b.l / 350 || (a.l / 350 == b.l / 350 && a.r < b.r);
}
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    int n;
    cin >> n;
    vector<int> prim;
    vector<bool> ip(1e6 + 1, 1);
    vector<int> pl(1e6 + 1);
    g.resize(n + 1);
    l.resize(n + 1);
    r.resize(n + 1);
    for(int i = 2; i <= 1e6; i++)
    {
        if(ip[i])
        {
            pl[i] = prim.size();
            prim.push_back(i);
            for(int j = 2 * i; j <= 1e6; j += i)
            {
                ip[j] = 0;
            }
        }
    }
    vector<int> v(n + 1, 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, 0);
    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};
    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];
        }
        else if(l[x] > l[y] && r[x] > r[y])
        {
            que[i].l = r[y];
            que[i].r = l[x];
        }
        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].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]--;
            }
        }
        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;
            }
        }
    }
    for(auto x : ans) cout << prim[x] << "\n";
}
Részfeladat Összpont Teszt Verdikt Idő Memória
subtask1 0/0
1 Elfogadva 18ms 10948 KiB
subtask2 5/5
2 Elfogadva 17ms 11164 KiB
3 Elfogadva 18ms 11384 KiB
4 Elfogadva 17ms 11352 KiB
5 Elfogadva 17ms 11688 KiB
6 Elfogadva 18ms 11992 KiB
7 Elfogadva 18ms 12088 KiB
8 Elfogadva 18ms 12308 KiB
9 Elfogadva 18ms 12548 KiB
10 Elfogadva 18ms 12492 KiB
11 Elfogadva 19ms 12496 KiB
subtask3 0/5
12 Elfogadva 17ms 12336 KiB
13 Elfogadva 17ms 12696 KiB
14 Hibás válasz 17ms 12796 KiB
15 Elfogadva 18ms 12944 KiB
16 Elfogadva 18ms 12800 KiB
17 Elfogadva 18ms 13284 KiB
18 Elfogadva 19ms 13240 KiB
19 Elfogadva 18ms 13204 KiB
20 Hibás válasz 19ms 13332 KiB
21 Hibás válasz 19ms 13212 KiB
subtask4 10/10
22 Elfogadva 35ms 14696 KiB
23 Elfogadva 136ms 18652 KiB
24 Elfogadva 203ms 27408 KiB
25 Elfogadva 294ms 34148 KiB
26 Elfogadva 330ms 38220 KiB
27 Elfogadva 330ms 37760 KiB
subtask5 0/10
28 Hibás válasz 46ms 14940 KiB
29 Hibás válasz 165ms 18036 KiB
30 Hibás válasz 569ms 25076 KiB
31 Hibás válasz 1.19s 30228 KiB
32 Hibás válasz 1.496s 32192 KiB
33 Hibás válasz 1.504s 32196 KiB
subtask6 10/10
34 Elfogadva 18ms 13976 KiB
35 Elfogadva 32ms 15944 KiB
36 Elfogadva 79ms 20048 KiB
37 Elfogadva 164ms 28272 KiB
38 Elfogadva 232ms 36556 KiB
39 Elfogadva 266ms 37280 KiB
40 Elfogadva 266ms 40548 KiB
41 Elfogadva 275ms 37412 KiB
subtask7 0/15
42 Elfogadva 18ms 13992 KiB
43 Elfogadva 35ms 15168 KiB
44 Elfogadva 97ms 18896 KiB
45 Elfogadva 252ms 25208 KiB
46 Elfogadva 455ms 30452 KiB
47 Elfogadva 547ms 32228 KiB
48 Elfogadva 544ms 32500 KiB
49 Elfogadva 537ms 32392 KiB
50 Hibás válasz 584ms 32452 KiB
51 Hibás válasz 119ms 36588 KiB
52 Elfogadva 152ms 29248 KiB
53 Elfogadva 155ms 35272 KiB
54 Hibás válasz 119ms 36472 KiB
55 Elfogadva 152ms 29120 KiB
56 Elfogadva 1.1s 29176 KiB
subtask8 20/20
57 Elfogadva 34ms 15940 KiB
58 Elfogadva 78ms 20764 KiB
59 Elfogadva 150ms 24768 KiB
60 Elfogadva 256ms 30432 KiB
61 Elfogadva 257ms 39264 KiB
62 Elfogadva 261ms 41424 KiB
63 Elfogadva 379ms 37912 KiB
64 Elfogadva 333ms 38760 KiB
65 Elfogadva 173ms 42072 KiB
66 Elfogadva 166ms 41984 KiB
subtask9 0/25
67 Hibás válasz 41ms 15584 KiB
68 Elfogadva 90ms 18684 KiB
69 Hibás válasz 194ms 22216 KiB
70 Hibás válasz 620ms 26032 KiB
71 Elfogadva 523ms 32484 KiB
72 Elfogadva 542ms 32640 KiB
73 Hibás válasz 1.148s 32616 KiB
74 Hibás válasz 810ms 32628 KiB
75 Hibás válasz 669ms 32676 KiB
76 Hibás válasz 828ms 32624 KiB
77 Hibás válasz 892ms 32752 KiB
78 Hibás válasz 736ms 32732 KiB
79 Hibás válasz 903ms 32624 KiB
80 Elfogadva 367ms 36284 KiB
81 Elfogadva 398ms 36284 KiB
82 Elfogadva 175ms 41636 KiB
83 Elfogadva 833ms 37732 KiB