Pagini recente » Cod sursa (job #729107) | Cod sursa (job #2791993) | Cod sursa (job #2546126) | Cod sursa (job #2864762) | Cod sursa (job #905161)
Cod sursa(job #905161)
#include <iostream>
#include <fstream>
#include <cstring>
#include <algorithm>
#include <queue>
#define DN 313
#define DQ 20005
#define per pair<int,int>
#define f first
#define s second
#define mp make_pair
#define t1 val [ Q[i].f.f ][ Q[i].f.s ]
#define t2 val [ Q[i].s.f ][ Q[i].s.s ]
using namespace std;
int a[DN][DN],t[DN*DN],val[DN][DN],rez[DQ],q,n,x;
bool viz[DN][DN];
pair< per , per > Q[DQ];
queue< per > qu;
int ii[]={-1,1,0,0},jj[]={0,0,1,-1};
bool cmp(int a,int b)
{
return a>b;
}
void make(int nod,int root)
{
while(t[nod]!=nod)
{
int next_nod=t[nod];
t[nod]=root;
nod=next_nod;
}
t[nod]=root;
}
int get_t(int nod)
{
while(t[nod]!=nod)
nod=t[nod];
return nod;
}
void reconst(int mini)
{
//cout<<mini<<endl;
memset(viz,0,sizeof(viz));
for(int i=1;i<=n*n;++i)
t[i]=i;
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
if(a[i][j]>=mini && viz[i][j]==0)
{
qu.push(make_pair(i,j));
while(qu.size())
{
int x=qu.front().f;
int y=qu.front().s;
viz[x][y]=true;
qu.pop();
int root=get_t( val[x][y] );
for(int t=0;t<4;++t)
{
int xx=x+ii[t];
int yy=y+jj[t];
if( xx >=1 && xx<=n && yy>=1 && yy<=n && !viz[xx][yy] && a[xx][yy]>=mini)
{
viz[xx][yy]=true;
make(val[xx][yy],root);
qu.push(mp(xx,yy));
}
}
}
}
}
void caut(int st,int dr)
{
if(st<=dr)
{
int mij=(st+dr)/2;
reconst(mij);
bool m=false,p=false;
for(int i=1;i<=q;++i)
{
if(t[ t1 ] != t[ t2 ] )
m=true;
else
rez[i]=max(rez[i],mij),p=true; // caut mai mare
}
if(m==true)
caut(st,mij-1);
if(p==true)
caut(mij+1,dr);
}
}
int main()
{
int hmax=0;
ifstream f("matrice2.in");
ofstream g("matrice2.out");
f>>n>>q;
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
{
f>>a[i][j];
hmax=max(hmax,a[i][j]);
val[i][j]=++x;
}
for(int i=1;i<=q;++i)
f>>Q[i].f.f>>Q[i].f.s>>Q[i].s.f>>Q[i].s.s;
caut(1,hmax);
for(int i=1;i<=q;++i)
g<<rez[i]<<"\n";
return 0;
}