Pagini recente » Cod sursa (job #681427) | Cod sursa (job #317239) | Cod sursa (job #461097) | Cod sursa (job #502836) | Cod sursa (job #1053555)
#include<fstream>
#include<vector>
#include<cmath>
using namespace std;
int n,T,mat[310][310],valmax,sol[20100];
struct Pozitie{int x,y;};
vector <Pozitie> G[1000100];
struct Query{int xs,ys,xf,yf;};
Query Q[20100];
int dx[]={1,0,-1,0};
int dy[]={0,1,0,-1};
int tata[100100],h[100100];
bool viz[310][310];
vector <int> q[2];
inline int Find(int x)
{
int r=x;
while(tata[r])
r=tata[r];
int y=x,aux;
while(y!=r)
{
aux=tata[y];
tata[y]=r;
y=aux;
}
return r;
}
inline void Union(int x,int y)
{
if(h[x]>h[y])
tata[y]=x;
else
{
tata[x]=y;
if(h[x]==h[y])
h[y]++;
}
}
int main()
{
int i,j,k,x,y,A,B,p;
Pozitie aux;
ifstream fin("matrice2.in");
fin>>n>>T;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
fin>>mat[i][j];
aux.x=i;
aux.y=j;
G[mat[i][j]].push_back(aux);
valmax=max(valmax,mat[i][j]);
}
}
for(i=1;i<=T;i++)
{
fin>>Q[i].xs>>Q[i].ys>>Q[i].xf>>Q[i].yf;
q[0].push_back(i);
}
fin.close();
p=0;
for(k=valmax;k>0;k--)
{
if(G[k].size()==0)
continue;
for(i=G[k].size()-1;i>=0;i--)
{
aux=G[k][i];
viz[aux.x][aux.y]=true;
for(j=0;j<4;j++)
{
x=aux.x+dx[j];
y=aux.y+dy[j];
if(x>0 && x<=n && y>0 && y<=n && viz[x][y])
{
A=Find(x*n+y);
B=Find(aux.x*n+aux.y);
if(A!=B)
Union(A,B);
}
}
}
for(i=q[p].size()-1;i>=0;i--)
{
A=Find(Q[q[p][i]].xs*n+Q[q[p][i]].ys);
B=Find(Q[q[p][i]].xf*n+Q[q[p][i]].yf);
if(A==B)
sol[q[p][i]]=k;
else
q[1-p].push_back(q[p][i]);
}
q[p].clear();
p=1-p;
}
ofstream fout("matrice2.out");
for(i=1;i<=T;i++)
fout<<sol[i]<<"\n";
fout.close();
return 0;
}