rt,感激不尽
#include<cstdio>
#include<iostream>
#define MAXN 100005
using namespace std;
int t, n, q, m;
int s[MAXN], las[MAXN], nxt[MAXN];
int num[MAXN << 6], lson[MAXN << 6], rson[MAXN << 6];
int rt[MAXN], cnt;
int Reads() {
int f = 1, res = 0;
char ch = getchar();
while (ch < '0' || ch > '9') {
if (ch == '-')
f = -1;
ch = getchar();
}
while (ch >= '0' && ch <= '9') {
res = (res << 3) + (res << 1) + (ch ^ 48);
ch = getchar();
}
return f * res;
}
void Builds(int lef, int rig, int k) {
if (lef == rig) {
num[k] = las[lef];
return ;
}
int mid = (lef + rig) >> 1;
lson[k] = ++cnt;
rson[k] = ++cnt;
Builds(lef, mid, lson[k]);
Builds(mid + 1, rig, rson[k]);
return ;
}
void Changes(int lef, int rig, int p, int v, int lass, int nows) {
if (lef == rig) {
num[nows] = v;
return ;
}
int mid = (lef + rig) >> 1;
if (p <= mid) {
rson[nows] = rson[lass];
lson[nows] = ++cnt;
Changes(lef, mid, p, v, lson[lass], lson[nows]);
} else {
lson[nows] = lson[lass];
rson[nows] = ++cnt;
Changes(mid + 1, rig, p, v, rson[lass], rson[nows]);
}
return ;
}
int Query(int lef, int rig, int p, int k) {
if (lef == rig)
return num[k];
int mid = (lef + rig) >> 1;
if (p <= mid)
return Query(lef, mid, p, lson[k]);
else Query(mid + 1, rig, p, rson[k]);
}
int main() {
t = Reads(), n = Reads(), q = Reads(), m = Reads();
for (int i = 1; i <= n; i++)
s[i] = Reads();
for (int i = 1; i <= m; i++)
las[i] = n + 1;
for (int i = n; i; i--)
nxt[i] = las[s[i]], las[s[i]] = i;
rt[0] = cnt = 1;
Builds(1, m, rt[0]);
for (int i = 1; i <= n; i++) {
rt[i] = ++cnt;
Changes(1, m, s[i], nxt[i], rt[i - 1], rt[i]);
}
while (q--) {
int d = Reads(), ns = 0;
for (int i = 1; i <= d; i++) {
int t = Reads();
if (ns <= n)
ns = Query(1, m, t, rt[ns]);
}
if (ns <= n)
cout << "Yes\n";
else cout << "No\n";
}
return 0;
}