Pagini recente » Cod sursa (job #2459943) | Cod sursa (job #749486) | Cod sursa (job #246884) | Cod sursa (job #926210) | Cod sursa (job #1347271)
#include<fstream>
#include<algorithm>
#include<cstring>
#define N 310
#define Q 20100
#define x first
#define y second
using namespace std;
ifstream f("matrice2.in");
ofstream g("matrice2.out");
int i,j,q,n,nr,m,k,t[N * N],b[N][N],a[N][N],sol[Q];
const int dx[] = {0,0,-1,1};
const int dy[] = {1,-1,0,0};
pair<int,int>v[N * N];
struct query{int x,y,x1,y1,p;}qu[Q];
inline bool cmp(pair<int,int>aa,pair<int,int>b){
return a[aa.x][aa.y] > a[b.x][b.y];
}
inline bool cmp1(query x,query y){
return sol[x.p] > sol[y.p];
}
inline int tata(int x){
if(t[x] == x)
return t[x];
return t[x] = tata(t[x]);
}
inline void uneste(int x,int y){
t[y] = x;
}
int main()
{
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 >> qu[i].x >> qu[i].y >> qu[i].x1 >> qu[i].y1;
qu[i].p = i;
}
for(k = 20; k >= 0; --k)
{
sort(qu + 1, qu + q + 1, cmp1);
memset(b, 0, sizeof(b));
for(i = 1; i <= nr; ++i)
t[i] = i;
for(i = j = 1, m = 0; j <= q; ++j)
{
while(i <= nr && sol[qu[j].p] + (1 << k) <= a[v[i].x][v[i].y])
{
b[v[i].x][v[i].y] = ++m;
for(int di = 0; di <= 3; ++di)
if(b[v[i].x + dx[di]][v[i].y + dy[di]])
uneste(tata(b[v[i].x][v[i].y]), tata(b[v[i].x + dx[di]][v[i].y + dy[di]]));
++i;
}
if(tata(b[qu[j].x][qu[j].y]) == tata(b[qu[j].x1][qu[j].y1]) && tata(b[qu[j].x1][qu[j].y1]))
sol[qu[j].p] += (1 << k);
}
}
for(i = 1; i <= q; ++i)
g << sol[i] << '\n';
return 0;
}