Pagini recente » Cod sursa (job #1353916) | Cod sursa (job #220698) | Cod sursa (job #2468387) | Cod sursa (job #3128233) | Cod sursa (job #1064143)
#include<stdio.h>
#include<algorithm>
#include<vector>
using namespace std;
int sol[20001], t[90001], noduri[302][302];
int dx[] = { -1, 0, 1, 0 };
int dy[] = { 0, 1, 0, -1 };
struct numere
{
int val, poz, x, y;
}A[90001], Q2[20001];
struct querry
{
int x1, y1, x2, y2;
}Q[20001];
inline int cmp(numere a, numere b)
{
return a.val > b.val;
}
int tata(int x)
{
if (x != t[x])
t[x] = tata(t[x]);
return t[x];
}
int main()
{
FILE*f = fopen("matrice.in", "r");
int n, q;
fscanf(f, "%d %d", &n, &q);
int nr = 0;
for (int i = 1; i <= n; ++i)
{
for (int j = 1; j <= n; ++j)
{
fscanf(f, "%d", &A[++nr].val);
A[nr].poz = nr;
A[nr].x = i;
A[nr].y = j;
}
}
for (int i = 1; i <= q; ++i)
fscanf(f, "%d %d %d %d", &Q[i].x1, &Q[i].y1, &Q[i].x2, &Q[i].y2);
fclose(f);
sort(A + 1, A + nr + 1, cmp);
int pas=1;
for (; pas < A[1].val; pas <<= 1);
for (; pas; pas >>= 1)
{
for (int I = 1; I <= q; ++I)
{
Q2[I].val = sol[I] + pas;
Q2[I].poz = I;
}
for (int I = 1; I <= nr; ++I)
{
t[I] = I;
}
sort(Q2 + 1, Q2 + q + 1, cmp);
for (int I = 1; I <= n; ++I)
{
for (int j = 1; j <= n; ++j)
{
noduri[I][j] = 0;
}
}
int i=1, j=1;
for (i = 1, j = 1; i <= nr;)
{
for (; j <= q&&Q2[j].val > A[i].val; ++j)
{
if (tata(n*(Q[Q2[j].poz].x1-1) + Q[Q2[j].poz].y1) == tata(n*(Q[Q2[j].poz].x2-1) + Q[Q2[j].poz].y2))
{
sol[Q2[j].poz] += pas;
}
}
for (int ii = i; A[i].val == A[ii].val; ++i)
{
noduri[A[i].x][A[i].y] = 1;
for (int dir = 0; dir < 4; ++dir)
{
int xv = A[i].x + dx[dir];
int yv = A[i].y + dy[dir];
if (xv && yv && xv <= n && yv <= n && noduri[xv][yv])
{
t[t[tata((xv - 1)*n + yv)]] = t[A[i].poz];
}
}
}
}
for (; j <= q; ++j)
{
if (tata((n - 1)*Q[Q2[j].poz].x1 + Q[Q2[j].poz].y1) == tata((n - 1)*Q[Q2[j].poz].x2 + Q[Q2[j].poz].y2))
{
sol[Q2[j].poz] += pas;
}
}
}
FILE*g = fopen("matrice.out", "w");
for (int i = 1; i <= q; ++i)
{
fprintf(g, "%d\n", sol[i]);
}
fclose(g);
return 0;
}