思路: 把长度为K 的串 hash 之后,就变成 查询区间中有没有某个数。
不知道为什么 RKHash 的思想 hash 时一直不过, 暴力 O(NK) hash 时 可以通过。
// 。。。bzoj 3207 打死不过 给跪了
#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <stack>
#include <cstring>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <assert.h>
#include <queue>
#define REP(i,n) for(int i=0;i<n;i++)
#define TR(i,x) for(typeof(x.begin()) i=x.begin();i!=x.end();i++)
#define ALLL(x) x.begin(),x.end()
#define SORT(x) sort(ALLL(x))
#define CLEAR(x) memset(x,0,sizeof(x))
#define FILLL(x,c) memset(x,c,sizeof(x))
using namespace std;
const double eps = 1e-9;
#define LL long long
#define pb push_back
const int maxn = 201000;
int n, q,k;
LL t[maxn];
const LL P = 107;
LL myhash(int l,int r){
LL ret = 0;
for(int i=l;i<=r;i++){
ret *= P;
ret += t[i];
}
return ret;
}
int tot;
LL tmp[maxn];
map<LL,int>mp;
map<LL,int>::iterator it;
struct Node{
Node *l ,*r;
int sum;
};
struct Seg{
Node nodes[maxn*40];
Node *null;
int C;
Node *root[maxn];
void init(){
C= 0;
null = &nodes[C++];
null ->l = null->r = null;
null->sum = 0 ;
root[0] = null;
}
Node *update(int pos,int left ,int right,Node *root){
Node *rt = &nodes[C++];
rt->l = root->l ;
rt->r = root->r;
rt->sum = root->sum;
if(left==right){
rt->sum ++;
return rt;
}
int mid = (left + right)>>1;
if(pos<=mid){
rt->l = update(pos,left,mid,root->l);
}else{
rt->r = update(pos,mid+1,right,root->r);
}
rt->sum = rt->l->sum + rt->r->sum;
return rt;
}
void solve(){
for(int i=1;i<=tot;i++){
root[i] = update(mp[tmp[i]],1,tot,root[i-1]);
}
}
int query(int pos,int left,int right,Node *root){
if(left == right)return root->sum ;
int mid = (left +right)>>1;
if(pos<=mid){
return query(pos,left,mid,root->l);
}else{
return query(pos,mid+1,right,root->r);
}
}
int query(int q,int L,int R){
if(R<=L)return 0;
int ans = query(q,1,tot,root[R]) - query(q,1,tot,root[L-1]);
return ans;
}
}S;
void solve1(){
S.init();
tot = n -k +1;
for(int i=1;i<=tot;i++){
tmp[i] = myhash(i,i+k-1);
}
mp.clear();
for(int i=1;i<=tot;i++){
mp[tmp[i]]=1;
}
int Q = 0;
for(it = mp.begin();it!=mp.end();it++){
Q++;
it->second = Q;
}
S.solve();
}
int x,y;
void solve(){
for(int i=1;i<=q;i++){
scanf("%d%d",&x,&y);
for(int j=1;j<=k;j++){
scanf("%lld",&t[j]);
}
LL hash = myhash(1,k);
//cout << hash<<endl;
if(mp.find(hash)==mp.end()){
puts("Yes");
}else{
int ans = S.query(mp[hash],x,y-k+1);
// cout << ans << "ans "<<endl;
if(ans>0){
puts("No");
}else{
puts("Yes");
}
}
}
}
int main(){
while(~scanf("%d%d%d",&n,&q,&k)){
for(int i =1;i<=n;i++){
scanf("%lld",&t[i]);
}
solve1();
solve();
}
return 0;
}