Pagini recente » Cod sursa (job #1099890) | Cod sursa (job #956244) | Cod sursa (job #1361914) | Cod sursa (job #769857) | Cod sursa (job #2400838)
#include <bits/stdc++.h>
#define pii pair <int, int>
#define piii pair <int, pii>
#define f first
#define s second
using namespace std;
ifstream fin ("matrice2.in");
ofstream fout ("matrice2.out");
const int nMax = 310, qMax = 20010;
struct query{int x1, x2, y1, y2, o, ans;};
int n, q, i, j, x, k, valc;
int findd[nMax][nMax], t[nMax*nMax];
int dx[] = {0, 0, 1, -1}, dy[] = {1, -1, 0, 0};
piii a[nMax*nMax];
query Q[qMax];
inline bool cmp(piii a, piii b)
{
return a.f > b.f;
}
inline bool cmpq(query a, query b)
{
return a.ans > b.ans;
}
inline bool cmpo(query a, query b)
{
return a.o < b.o;
}
inline bool check(int l, int c)
{
return (l>=1 && c>=1 && l<=n && c<=n);
}
int getTata(int nod)
{
if(t[nod] == nod) return nod;
t[nod] = getTata(t[nod]);
return t[nod];
}
void unite(int a, int b)
{
t[getTata(a)] = getTata(b);
}
void baga(int x, int val)
{
for(int i=0; i<4; i++)
{
int l = a[x].s.f + dx[i];
int c = a[x].s.s + dy[i];
if(check(l, c) && a[findd[l][c]].f >= val)
unite(x, findd[l][c]);
}
}
int main()
{
fin >> n >> q;
for(i=1; i<=n; i++)
for(j=1; j<=n; j++)
{
x = (i-1) * n + j;
fin >> a[x].f;
a[x].s.f = i;
a[x].s.s = j;
}
sort(a+1, a+n*n+1, cmp);
for(i=1; i<=n*n; i++)
findd[a[i].s.f][a[i].s.s] = i;
for(i=1; i<=q; i++)
{
fin >> Q[i].x1 >> Q[i].y1 >> Q[i].x2 >> Q[i].y2;
Q[i].o = i;
}
for(j=1<<20; j; j>>=1)
{
for(i=1; i<=n*n; i++) t[i] = i;
sort(Q+1, Q+q+1, cmpq);
k=1;
for(i=1; i<=q; i++)
{
valc = Q[i].ans + j;
for(; k <= n*n && a[k].f >= valc; k++)
baga(k, valc);
int p1 = findd[Q[i].x1][Q[i].y1];
int p2 = findd[Q[i].x2][Q[i].y2];
if(getTata(p1) == getTata(p2))
Q[i].ans += j;
}
}
sort(Q+1, Q+q+1, cmpo);
for(i=1; i<=q; i++)
fout << Q[i].ans << " ";
return 0;
}