Cod sursa(job #2736925)

Utilizator Leonard123Mirt Leonard Leonard123 Data 4 aprilie 2021 10:47:12
Problema Matrice 2 Scor 35
Compilator cpp-64 Status done
Runda oni_wellcode_day_4 Marime 2.25 kb
#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];

queue<pii> order;
int n, q, grid[305][305], cost[305][305], in_queue[305][305], indx[20005], answer[20005], x1, yy1, dl[] = {0, 1, -1, 0}, dc[] = {1, 0, 0, -1};

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;
    in_queue[x1][yy1] = 1;
    order.push(make_pair(x1, yy1));
    cost[x1][yy1] = grid[x1][yy1];
    while (!order.empty()) {
        int line = order.front().first;
        int column = order.front().second;
        in_queue[line][column] = 0;
        order.pop();
        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]);
                    if (in_queue[new_line][new_column] == 0) {
                        order.push({new_line, new_column});
                        in_queue[new_line][new_column] = 1;
                    }
                }
        }
    }
}

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";
}