这天,懋懋的女票又给他们投喂糖果啦!但这次zyw不在,只有易大师和懋懋独享这些糖果,它们被懋懋等分成了数量为 n 的两堆糖果 A = [a1, a2, ..., an] 和 B = [b1, b2, ..., bn],其中 ai 和 bi 为第 i 包糖果的口味(你不知道?糖果口味可多了,有苹果、草莓、菠萝、覆盆子等等)。
现在懋懋想考考你,若易大师吃完前 x 包糖果且懋懋也吃完前 y 包糖果条件下,它们尝过的糖果口味是一样的嘛?等等!zyw表示没吃到糖果很委屈,他想为这题增加难度——如果我重复问 q 次呢?你开始挠头......
Input
输入共 q + 3 行。
第一行输入两个正整数 n 和 q (1 ≤ n, q ≤ 100 000) 由空格键隔开,表示糖果数量和询问次数。
第二行输入 n 个正整数 a1, a2, ..., an 由空格键隔开,表示易大师的 n 包糖果,其中第 i 包糖果的口味是 ai (1 ≤ ai ≤ 100 000)。
第三行输入 n 个正整数 b1, b2, ..., bn 由空格键隔开,表示懋懋的 n 包糖果,其中第 i 包糖果的口味是 bi (1 ≤ bi ≤ 100 000)。
接下来 q 行,每行输入两个正整数 xi, yi (1 ≤ xi, yi ≤ n),表示询问若易大师吃完前 x 包糖果且懋懋也吃完前 y 包糖果条件下,他们吃过的糖果口味是否相同?
Output
请输出 q 行,每行表示询问答案,若他两吃过的口味相同则输出YES否则请输出NO,注意换行。
Example
input
Copy
5 3 1 2 3 4 5 1 3 2 4 3 1 2 3 3 4 5output
Copy
NO YES YESNote
对于第一个询问,易大师吃过的糖果口味是 {1},懋懋吃过的口味是 {1, 3} 因此不相同,回答NO;但对于第二个询问,他们吃过的口味都是 {1, 2, 3} 因此回答YES。
找当前a数组前k个数在b数组中最后出现的位置
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <cmath>
#include <queue>
#include <set>
#include <stack>
using namespace std;
#define int long long
typedef pair<int,int>PII;
constexpr int N=1e5+7;
int a[N],b[N],c[N],d[N];
bool st[N];
signed main()
{
ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++){
cin>>b[i];
}
int l=0;
for(int i=1;i<=n;i++){
while(!st[a[i]]) l++,st[b[l]]= true;
c[i]=l;
}
memset(st,0, sizeof st);
l=0;
for(int i=1;i<=n;i++){
while(!st[b[i]]) l++,st[a[l]]= true;
d[i]=l;
}
while(m--){
int x,y;
cin>>x>>y;
if(x>=d[y]&&y>=c[x]){
cout<<"YES"<<endl;
}
else{
cout<<"NO"<<endl;
}
}
return 0;
}