Pagini recente » Cod sursa (job #999031) | Cod sursa (job #1817716) | Cod sursa (job #3149856) | Cod sursa (job #845573) | Cod sursa (job #1086303)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <string.h>
#define N_MAX 90005
#define N_MIC 301
using namespace std;
int n,q,i,j,a[N_MIC][N_MIC],nr,rasp[20001],t[N_MIC],pas,b[N_MIC][N_MIC],m,di,t1,t2;
struct punct{
int x;
int y;
} v[N_MAX];
struct questions{
int x1;
int x2;
int y1;
int y2;
int p;
}que[20005];
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};
bool cmp(punct p1, punct p2){
return a[p1.x][p1.y]>a[p2.x][p2.y];
}
bool cmp2(questions s1, questions s2){
return rasp[s1.p]>rasp[s2.p];
}
void lip(int x, int y){
t[y]=x;
}
int father(int x){
if(x==t[x])
return x;
return
t[x]=father(t[x]);
}
int main()
{
ifstream f("matrice2.in");
ofstream g("matrice2.out");
f>>n>>q;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++){
f>>a[i][j];
v[++nr].x=i;
v[nr].y=j;
}
sort(v+1,v+nr+1,cmp);
for(i=1;i<=q;i++){
f>>que[i].x1>>que[i].y1>>que[i].x2>>que[i].y2;
que[i].p=i;
}
for(pas=(1<<20);pas!=0;pas=pas/2){
sort(que+1,que+q+1,cmp2);
memset(b,0,sizeof(b));
for(i=1;i<=n*n;i++){
t[i]=i;
}
for(i=j=1;j<=q;j++){
m=0;
while(i<=n*n && rasp[que[j].p]+pas<=a[v[i].x][v[i].y]){
b[v[i].x][v[i].y]=++m;
for(di=0;di<=3;di++)
if(b[v[i].x+dx[di]][v[i].y+dy[di]])
lip(father(b[v[i].x][v[i].y]), father(b[v[i].x+dx[di]][v[i].y+dy[di]]));
i++;
}
t1=father(b[que[j].x1][que[j].y1]);
t2=father(b[que[j].x2][que[j].y2]);
if(t1!=0 && t1==t2)
rasp[que[j].p]+=pas;
}
}
for(i=1;i<=q;i++)
g<<rasp[i]<<'\n';
return 0;
}