Pagini recente » Cod sursa (job #2613479) | Cod sursa (job #2118002) | Cod sursa (job #2192457) | Cod sursa (job #961321) | Cod sursa (job #2736919)
#include<bits/stdc++.h>
#define pii pair<int, int>
using namespace std;
ifstream fin("matrice2.in");
ofstream fout("matrice2.out");
struct query{
int a, b, c, d;
}queries[20005];
int n, q, grid[305][305], cost[305][305], indx[20005], answer[20005], x1, yy1, dl[] = {0, 1, -1, 0}, dc[] = {1, 0, 0, -1};
priority_queue <pair<int, pii>> order;
bool cmp(int x, int y) {
if (queries[x].a < queries[y].a)
return 1;
else if (queries[x].a == queries[y].a && queries[x].b < queries[y].b)
return 1;
return 0;
}
void solve() {
for (int i = 1; i <= n; i++ )
for (int j = 1; j <= n; j++)
cost[i][j] = 0;
order.push(make_pair(grid[x1][yy1],make_pair(x1, yy1)));
cost[x1][yy1] = grid[x1][yy1];
while (!order.empty()) {
int val = order.top().first;
int line = order.top().second.first;
int column = order.top().second.second;
order.pop();
if (val != cost[line][column])
continue;
for (int i = 0; i < 4; i++) {
int new_line = line + dl[i];
int new_column = column + dc[i];
if (max(new_line, new_column) <= n && min(new_line, new_column) > 0)
if (cost[new_line][new_column] < min(cost[line][column], grid[new_line][new_column])) {
cost[new_line][new_column] = min(cost[line][column], grid[new_line][new_column]);
order.push({cost[new_line][new_column], {new_line, new_column}});
}
}
}
}
int main() {
fin.tie(0);
fin >> n >> q;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
fin >> grid[i][j];
for (int i = 1; i <= q; i++) {
fin >> queries[i].a >> queries[i].b >> queries[i].c >> queries[i].d;
indx[i] = i;
}
sort(indx + 1, indx + q + 1, cmp);
for (int i = 1; i <= q; i++) {
x1 = queries[indx[i]].a;
yy1 = queries[indx[i]].b;
solve();
while (queries[indx[i]].a == x1 && queries[indx[i]].b == yy1 && i <= q) {
answer[indx[i]] = cost[queries[indx[i]].c][queries[indx[i]].d];
i++;
}
i--;
}
for (int i = 1; i <= q; i++)
fout << answer[i] << "\n";
}