Pagini recente » Cod sursa (job #1224801) | Cod sursa (job #737413) | Cod sursa (job #3240652) | Cod sursa (job #737351) | Cod sursa (job #2980142)
#include <bits/stdc++.h>
using namespace std;
ifstream f("matrice2.in");
ofstream g("matrice2.out");
const int nmax=302;
const int qmax= 2e4+1;
int v[nmax*nmax];
int par[nmax],siz[nmax];
bool vis[nmax];
int srt[nmax*nmax];
int n,q;
struct query{
int st,dr,sol;
};
query qs[qmax];
int dn[4];
int mtov(int i, int j)
{
return i*(n+2)+j;
}
int adj(int nod, int k)
{
int next=nod+dn[k];
return (v[next]==0)?-1:next;
}
struct arbnod{
int st,dr;
vector< query* > qs;
arbnod(){}
};
int getp(int x)
{
return (par[x]==0)?x:getp(par[x]);
}
bool adun(int a, int b)
{
if(b==-1) return 0;
a=getp(a);
b=getp(b);
if(a==b) return 0;
if(siz[a]<siz[b]) swap(a,b);
siz[a]+=siz[b];
par[b]=a;
return 1;
}
void dopar(int st, int dr)
{
for(int i=st;i<=dr;i++)
{
vis[srt[i]]=1;
for(int k=0;k<4;k++)
{
int nxt=adj(srt[i],k);
if(nxt==-1||!vis[nxt]) continue;
adun(srt[i],nxt);
}
}
}
void resetpad()
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
par[mtov(i,j)]=vis[mtov(i,j)]=0;
}
}
}
bool cmp(const int a,const int b)
{
return v[a]>v[b];
}
bool goodq(query* qer)
{
return getp(qer->st)==getp(qer->dr);
}
void read()
{
f>>n>>q;
int k=0;
dn[0]=1,dn[1]=-1,dn[2]=n+2,dn[3]=-n-2;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
f>>v[mtov(i,j)];
srt[k++]=mtov(i,j);
}
}
int a,b,c,d;
for(int i=1;i<=q;i++)
{
f>>a>>b>>c>>d;
qs[i].st=mtov(a,b);
qs[i].dr=mtov(c,d);
}
}
int32_t main()
{
read();
sort(srt,srt+n*n,cmp);
queue<arbnod> u;
u.push(arbnod());
u.front().st=0,u.front().dr=n*n-1;
for(int i=1;i<=q;i++) u.front().qs.push_back(&qs[i]);
// for(int i=1;i<=n;i++)
// {
// for(int j=1;j<=n;j++)
// {
// cout<<getp(mtov(i,j))<<' ';
// }
// cout<<'\n';
// }
int lastmid=0;
while(!u.empty())
{
auto &nod=u.front();
//cout<<"here "<<nod.st<<' '<<nod.dr<<' '<<nod.qs.size()<<';'<<v[srt[nod.st]]<<'\n';
int mid=(nod.st+nod.dr)/2;
if(mid<lastmid)
{
resetpad();
lastmid=0;
}
dopar(lastmid,mid);
// cout<<mid<<'\n';
// for(int i=1;i<=n;i++)
// {
// for(int j=1;j<=n;j++)
// {
// cout<<getp(mtov(i,j))<<' ';
// }
// cout<<'\n';
// }
lastmid=mid+1;
if(nod.st==nod.dr)
{
for(auto e:nod.qs)
{
e->sol=v[srt[nod.st]];
}
u.pop();
continue;
}
arbnod l,r;
l.st=nod.st,l.dr=mid;
r.st=mid+1,r.dr=nod.dr;
for(auto e:nod.qs)
{
if(goodq(e)) l.qs.push_back(e);
else r.qs.push_back(e);
}
if(!l.qs.empty())u.push(l);
if(!r.qs.empty())u.push(r);
u.pop();
}
for(int i=1;i<=q;i++)
{
g<<qs[i].sol<<'\n';
}
return 0;
}