Files
contests/2023/rcpc/d1/editorial/K. Distinctness Queries.cpp
2024-04-22 16:45:09 +03:00

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;
}