2023 rcpc
This commit is contained in:
100
2023/rcpc/d1/editorial/K. Distinctness Queries.cpp
Normal file
100
2023/rcpc/d1/editorial/K. Distinctness Queries.cpp
Normal file
@@ -0,0 +1,100 @@
|
||||
/// 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;
|
||||
}
|
||||
Reference in New Issue
Block a user