vector+二分
比可持久化线段树好写多了,速度也差不到哪里去。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<sstream>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<deque>
#include<cstdlib>
#include<ctime>
#define dd double
#define ld long double
#define ll long long
#define ull unsigned long long
#define N 100010
#define M number
using namespace std;
const int INF=0x3f3f3f3f;
inline int read(){
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
int type,n,q,m,a[N],b[N];
vector<int> v[N];
int main(){
type=read(),n=read(),q=read(),m=read();
for(int i=1;i<=n;i++){
a[i]=read();
v[a[i]].push_back(i);
}
for(int i=1;i<=q;i++){
int l=read(),last=0;bool op=1;
for(int j=1;j<=l;j++) b[j]=read();
for(int j=1;j<=l;j++){
vector<int>::iterator it=upper_bound(v[b[j]].begin(),v[b[j]].end(),last);
if(it==v[b[j]].end()){
op=0;break;
}
last=*it;
}
if(op) printf("Yes\n");
else printf("No\n");
}
}