Pagini recente » Cod sursa (job #1640821) | Cod sursa (job #1296700) | Rating Argatu Cosmin (argatu_cosmin) | Cod sursa (job #2033979) | Cod sursa (job #2495362)
#include <bits/stdc++.h>
#define NMAX 304
#define QMAX 20004
#define pb push_back
#define ft first
#define sd second
using namespace std;
ifstream fin("matrice2.in");
ofstream fout("matrice2.out");
typedef pair <int, int> pairINT;
typedef long long ll;
int n,q,urm[NMAX*NMAX], sz[NMAX*NMAX], sol[QMAX],m[NMAX][NMAX];
bool usedq[NMAX*NMAX];
vector <pair <int, pairINT>> edge;
vector <pairINT> waiting[NMAX*NMAX];
void read();
void umerge(int,int,int);
int getu(int);
int main(){
read();
for(int i=0,cost,x,y,u1,u2;i<edge.size();++i){
cost=edge[i].ft;
x=edge[i].sd.ft, y=edge[i].sd.sd;
u1=getu(x), u2=getu(y);
if(u1!=u2){
if(sz[u1] > sz[u2])
umerge(u1,u2,cost);
else
umerge(u2, u1, cost);
}
}
for(int i=0;i<q;++i)
fout<<sol[i]<<'\n';
return 0;
}
void umerge(int x,int y,int cost){// merge x with y
int u;
while(!waiting[y].empty()){
u=getu(waiting[y].back().ft);
if(u == x && !usedq[waiting[y].back().sd]){
sol[waiting[y].back().sd]=cost;
usedq[waiting[y].back().sd]=1;
}else if(!usedq[waiting[y].back().sd])
waiting[x].pb(waiting[y].back());
waiting[y].pop_back();
}
urm[y]=x;
sz[y]+=sz[x];
}
int getu(int node){
while(urm[node]) node=urm[node];
return node;
}
void read(){// & build graph
int x,y,cost;
fin>>n>>q;
for(int i=1;i<=n;++i){
for(int j=1;j<=n;++j){
fin>>m[i][j];
x=n*(i-1) + j;
sz[x]=1;
if(i-1){
y=n*(i-2) + j;
cost=min(m[i][j], m[i-1][j]);
edge.pb({cost, {x, y}});
edge.pb({cost, {y, x}});
}
if(j-1){
y=x-1;
cost=min(m[i][j], m[i][j-1]);
edge.pb({cost, {y, x}});
edge.pb({cost, {x, y}});
}
}
}
sort(edge.begin(), edge.end(), greater<pair <int, pairINT>>());
for(int i=0,a,b;i<q;++i){
fin>>a>>b;
x=n*(a-1) + b;
fin>>a>>b;
y=n*(a-1) + b;
waiting[x].pb({y, i});
waiting[y].pb({x, i});
}
}