101 lines
2.5 KiB
C++
101 lines
2.5 KiB
C++
/// Gheorghies Alexandru
|
|
/// this problem is really painful to implement
|
|
#include<bits/stdc++.h>
|
|
|
|
using namespace std;
|
|
typedef long long ll;
|
|
typedef pair<ll,ll> pll;
|
|
const ll NMAX=1e5+5,NSQRMAX=1.6e7+5,MOD=1e9+7;
|
|
ll b[NMAX],actualnxt[NMAX],actualprv[NMAX],n,m;
|
|
ll ans[NSQRMAX],tmpans[NMAX];
|
|
ll prv[NMAX],nxt[NMAX],last[NMAX];
|
|
ll f(ll i1, ll i2, ll j){
|
|
return m*((n*(n+1)-(n-i1)*(n-i1+1))/2+i2-i1)+j;
|
|
}
|
|
void Push_back(ll p){
|
|
if(last[b[p]]==-1)
|
|
prv[p]=-1,nxt[p]=-1;
|
|
else
|
|
nxt[last[b[p]]]=p,prv[p]=last[b[p]],nxt[p]=-1;
|
|
last[b[p]]=p;
|
|
}
|
|
void Erase(ll p){
|
|
if(nxt[p]==-1 && prv[p]==-1){
|
|
last[b[p]]=-1;
|
|
return;
|
|
}
|
|
if(prv[p]!=-1) nxt[prv[p]]=nxt[p];
|
|
if(nxt[p]!=-1) prv[nxt[p]]=prv[p];
|
|
nxt[p]=prv[p]=-1;
|
|
}
|
|
int main()
|
|
{
|
|
#ifndef ONLINE_JUDGE
|
|
freopen("in.txt","r",stdin);
|
|
freopen("out.txt","w",stdout);
|
|
#endif
|
|
ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
|
|
for(ll i=0;i<NMAX;i++) last[i]=-1;
|
|
ll q;
|
|
bool flipped=0;
|
|
cin>>n>>m;
|
|
if(n<=m){
|
|
for(ll i=0;i<n;i++)
|
|
for(ll j=0;j<m;j++)
|
|
cin>>b[i*m+j];
|
|
}
|
|
else{
|
|
for(ll i=0;i<n;i++)
|
|
for(ll j=0;j<m;j++)
|
|
cin>>b[j*n+i];
|
|
swap(n,m);
|
|
flipped=1;
|
|
}
|
|
for(ll i1=0;i1<n;i1++){
|
|
for(ll j=0;j<m;j++){
|
|
for(ll i2=i1;i2<n;i2++){
|
|
Push_back(i2*m+j);
|
|
}
|
|
}
|
|
for(ll i2=n-1;i2>=i1;i2--){
|
|
for(ll j=0;j<m;j++){
|
|
ll p=i2*m+j;
|
|
actualprv[p]=(prv[p]==-1?-1:prv[p]%m);
|
|
actualnxt[p]=(nxt[p]==-1?m:nxt[p]%m);
|
|
|
|
if(actualprv[p]==j || actualnxt[p]==j)
|
|
actualprv[p]=actualnxt[p]=j;
|
|
}
|
|
for(ll j=0;j<m;j++) Erase(i2*m+j);
|
|
}
|
|
for(ll j=0;j<=m;j++) tmpans[j]=m;
|
|
for(ll i2=i1;i2<n;i2++){
|
|
for(ll j=m-1;j>=0;j--){
|
|
ll p=i2*m+j;
|
|
if(actualprv[p]>=0)
|
|
tmpans[actualprv[p]]=min(tmpans[actualprv[p]],j);
|
|
if(actualnxt[p]<m)
|
|
tmpans[j]=min(tmpans[j],actualnxt[p]);
|
|
}
|
|
for(ll j=m-1;j>=0;j--){
|
|
tmpans[j]=min(tmpans[j],tmpans[j+1]);
|
|
ans[f(i1,i2,j)]=tmpans[j]-1;
|
|
}
|
|
}
|
|
}
|
|
cin>>q;
|
|
while(q--){
|
|
ll a,b,c,d;
|
|
cin>>a>>b>>c>>d;
|
|
|
|
if(flipped) swap(a,b),swap(c,d);
|
|
a--,b--,c--,d--;
|
|
|
|
if(ans[f(a,c,b)]>=d)
|
|
cout<<"YES\n";
|
|
else
|
|
cout<<"NO\n";
|
|
}
|
|
return 0;
|
|
}
|