v[x]记录了x值的出现位置序列。
对每个b中的元素,每次在v[b[i]]中二分。
因此要记录上一次二分到了a数组的哪个位置。
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
#define N 1000001
vector<int>v[N];
int x,m,n,b[N];
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;++i)
{
scanf("%d",&x);
v[x].push_back(i);
}
scanf("%d",&m);
for(;m;--m)
{
scanf("%d",&n);
for(int i=1;i<=n;++i) scanf("%d",&b[i]);
int last=0;
for(int i=1;i<=n;++i)
{
vector<int>::iterator it=upper_bound(v[b[i]].begin(),v[b[i]].end(),last);
if(it==v[b[i]].end())
{
puts("NIE");
goto FAIL;
}
last=*it;
}
puts("TAK"); continue;
FAIL:;
}
return 0;
}