///*** Sown_Vipro ***///
/// ->TEAM SELECTION TEST<- ///
#include<bits/stdc++.h>
using namespace std;
//#pragma GCC optimize ("O3")
//#pragma GCC optimize ("unroll-loops")
//#pragma GCC target("popcnt")
#define F first
#define S second
#define pb push_back
#define pi pair<int, int>
#define pii pair<int, pair<int, int> >
#define FOR(i, a, b) for(int i = a; i <= b; ++i)
#define REP(i, a, b) for(int i = a; i >= b; --i)
#define all(s) s.begin(), s.end()
#define szz(s) int(s.size())
const string NAME = "sown";
const int N = 1e6 + 5, MAX = 1e6, MOD = 1e9 + 7;
void maxi(int &x, int y){ if(x < y) x = y; }
void mini(int &x, int y){ if(x > y) x = y; };
void add(int &x, int y){ x += y; x += MOD * (x < 0); x -= MOD * (x >= MOD); };
int n, q, res, TIME, stt;
int s[N], c[N], nxt[N], ver[N], chain[N], p[N], in[N], cc[N], icon[N], a[N], d[N], check[N];
vector<int> e[N];
void pre(int u){
s[u] = 1;
c[u] = (e[u].size() == 1);
for(int v : e[u]){
if(v == p[u]) continue;
p[v] = u;
pre(v);
s[u] += s[v];
if(s[v] > s[nxt[u]]) nxt[u] = v;
c[u] += c[v];
}
}
pi st[4 * N];
int lz[4 * N];
pi Merge(pi A, pi B){
return {A.F + B.F, A.S + B.S};
}
void build(int id, int l, int r){
if(l == r){
if(ver[l] != 1){
// cout << ver[l] << " " << c[ver[l]] << "\n";
st[id].F = (c[ver[l]] % 2 == 0);
st[id].S = (c[ver[l]] % 2 != 0);
}
return;
}
int m = (l + r) / 2;
build(2 * id, l, m);
build(2 * id + 1, m + 1, r);
st[id] = Merge(st[2 * id], st[2 * id + 1]);
}
void down(int id){
if(lz[id]){
swap(st[2 * id].F, st[2 * id].S);
swap(st[2 * id + 1].F, st[2 * id + 1].S);
lz[2 * id] ^= 1;
lz[2 * id + 1] ^= 1;
lz[id] = 0;
}
}
void update(int id, int l, int r, int u, int v){
if(l > v || r < u) return;
if(u <= l && r <= v){
swap(st[id].F, st[id].S);
lz[id] ^= 1;
// cout << l << " " << r << " " << st[id].F << " " << st[id].S << "\n";
return;
}
down(id);
int m = (l + r) / 2;
update(2 * id, l, m, u, v);
update(2 * id + 1, m + 1, r, u, v);
st[id] = Merge(st[2 * id], st[2 * id + 1]);
}
void hld(int u, int p){
if(!icon[stt]) icon[stt] = u;
chain[u] = stt;
in[u] = ++TIME;
ver[TIME] = u;
if(nxt[u]) hld(nxt[u], u);
for(int v : e[u]){
if(v != p && v != nxt[u]){
++stt;
hld(v, u);
}
}
}
void solve(){
cin >> n >> q;
FOR(i, 2, n){
int u, v; cin >> u >> v;
e[u].pb(v);
e[v].pb(u);
}
pre(1);
hld(1, 0);
build(1, 1, n);
// cout << st[1].F;
while(q--){
int s; cin >> s;
int leaves = 0;
FOR(i, 1, s){
cin >> a[i];
if(cc[a[i]] == 0){
cc[a[i]] = 1;
leaves += (e[a[i]].size() == 1);
}
++d[a[i]];
}
// cout << c[1] << " " << s << " " << leaves << "\n";
if((c[1] + s - leaves) % 2){
cout << -1 << "\n";
FOR(i, 1, s){
--d[a[i]];
cc[a[i]] = 0;
}
continue;
}
FOR(i, 1, s){
if((d[a[i]] - (e[a[i]].size() == 1)) % 2 && check[a[i]] == 0){
check[a[i]] = 1;
int u = a[i];
// cout << u << "\n";
while(chain[u] != chain[1]){
update(1, 1, n, in[icon[chain[u]]], in[u]);
// cout << icon[chain[u]] << " " << u << "\n";
u = p[icon[chain[u]]];
}
update(1, 1, n, 1, in[u]);
}
}
cout << n + s - 1 + st[1].F << "\n";
FOR(i, 1, s){
if((d[a[i]] - (e[a[i]].size() == 1)) % 2 && check[a[i]] == 1){
check[a[i]] = 0;
int u = a[i];
while(chain[u] != chain[1]){
update(1, 1, n, in[icon[chain[u]]], in[u]);
// cout << icon[chain[u]] << " " << u << "\n";
u = p[icon[chain[u]]];
}
update(1, 1, n, 1, in[u]);
}
}
FOR(i, 1, s){
--d[a[i]];
cc[a[i]] = 0;
}
}
}
signed main(){
ios_base::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
if(fopen((NAME + ".inp").c_str(), "r")){
freopen((NAME + ".inp").c_str(), "r", stdin);
// freopen((NAME + ".out").c_str(), "w", stdout);
}
int t = 1;
// cin >> t;
while(t--){
solve();
}
}
Compilation message (stderr)
cleaning.cpp: In function 'int main()':
cleaning.cpp:177:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
177 | freopen((NAME + ".inp").c_str(), "r", stdin);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |