Pagini recente » Cod sursa (job #3233371) | Cod sursa (job #551227) | Cod sursa (job #949858) | Cod sursa (job #765) | Cod sursa (job #3287562)
#include <bits/stdc++.h>
#define nmx 305
#define qmx 20005
using namespace std;
int n,q,v[nmx][nmx],rsp[qmx],ct,sz[nmx*nmx],roo[nmx*nmx];
struct edge
{
int c,x,y;
};
int cod(int i,int j)
{
return (i-1)*n+j;
}
set <int> rs[nmx*nmx];
edge m[nmx*nmx*4];
int root(int r)
{
if (roo[r]==r)
return r;
return roo[r]=root(roo[r]);
}
void merg(int x,int y,int cost)
{
if (sz[x]<sz[y])
swap(x,y);
sz[x]+=sz[y];
sz[y]=0;
roo[y]=x;
for (auto it : rs[y])
{
if (rs[x].find(it)!=rs[x].end())
{
rsp[it]=cost;
rs[x].erase(it);
}
else rs[x].insert(it);
}
rs[y].clear();
}
bool cmp(edge a,edge b)
{
return a.c>b.c;
}
int main()
{
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>>v[i][j];
for (int i=1; i<=n; i++)
for (int j=1; j<=n; j++)
{
int x=cod(i,j);
if (i<n)
{
int y=cod(i+1,j);
m[++ct]= {min(v[i][j],v[i+1][j]),x,y};
}
if (j<n)
{
int y=cod(i,j+1);
m[++ct]= {min(v[i][j],v[i][j+1]),x,y};
}
}
sort (m+1,m+ct+1,cmp);
for (int i=1; i<=n*n; i++)
sz[i]=1,roo[i]=i;
int a,b,c,d;
for (int i=1; i<=q; i++)
{
f>>a>>b>>c>>d;
rs[cod(a,b)].insert(i);
rs[cod(c,d)].insert(i);
}
for (int i=1; i<=ct; i++)
{
int xs=root(m[i].x);
int ys=root(m[i].y);
if (xs==ys) continue;
else
merg(xs,ys,m[i].c);
}
for (int i=1; i<=q; i++)
g<<rsp[i]<<'\n';
}