Pagini recente » Cod sursa (job #963641) | Cod sursa (job #1228102) | Cod sursa (job #1642835) | Cod sursa (job #376897) | Cod sursa (job #1234173)
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
ifstream fin("matrice2.in");
ofstream fout("matrice2.out");
#define MAXN 301
#define MAXM 20001
int n;
struct el{
int i, j, val;
};
struct query{
int x1, x2, y1, y2, val, ind;
};
inline int p(int a, int b)
{
return (a - 1) * n + b;
}
el a[MAXN*MAXN];
query q[MAXM];
inline bool cmp1(el a, el b)
{
return a.val<b.val;
}
inline bool cmp2(query a, query b)
{
return a.val>b.val;
}
inline bool cmp3(query a, query b)
{
return a.ind<b.ind;
}
int dr=0;
int md[MAXN*MAXN];
int dir[4][2] = { {0, 1}, {0, -1}, {1, 0}, {-1, 0} };
int b[MAXN][MAXN];
int m;
int dad(int a)
{
if(a != md[a])
a = dad(md[a]);
return md[a];
}
void unite(int a, int b)
{
md[dad(a)] = dad(b);
}
void update(el a)
{
for(int k = 0 ; k < 4 ; k++)
{
int ni = a.i + dir[k][0];
int nj = a.j + dir[k][1];
if(b[ni][nj] >= b[a.i][a.j])
unite(p(ni, nj), p(a.i, a.j));
}
}
void cautbin()
{
int i, step;
for(step = 1 ; step <= dr ; step <<= 1 );
for(; step ; step >>= 1)
{
if(step <= dr)
{
for(i = 1 ; i <= dr ; i++)
md[i]=i;
sort(q + 1, q + m + 1, cmp2);
int ind = 1;
for(i = dr ; i >= 1 ; i--)
{
update(a[i]);
while(q[ind].val + step == i && ind <= m)
{
if(dad(p(q[ind].x1, q[ind].y1)) == dad(p(q[ind].x2, q[ind].y2)))
{
q[ind].val+=step;
}
ind++;
}
}
}
}
}
int main()
{
int i, j;
fin>>n>>m;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
fin>>a[++dr].val;
b[i][j] = a[dr].val;
a[dr].i = i;
a[dr].j = j;
}
}
for(i=1;i<=m;i++)
{
fin>>q[i].x1>>q[i].y1>>q[i].x2>>q[i].y2;
q[i].ind=i;
}
sort(a+1, a+dr+1, cmp1);
cautbin();
sort(q + 1, q + m + 1, cmp3);
for(i = 1 ; i <= m ; i++)
{
fout << a[q[i].val].val << "\n";
}
}