Cod sursa(job #2491506)

Utilizator AlexBolfaAlex Bolfa AlexBolfa Data 12 noiembrie 2019 18:02:18
Problema Matrice 2 Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.78 kb
#include <bits/stdc++.h>
#define NMAX 304
#define QMAX 20004
#define pb push_back
#define ft first
#define sd second
using namespace std;
ifstream fin("matrice2.in");
ofstream fout("matrice2.out");
typedef pair <int, pair <int, int>> pairINT;
typedef long long ll;

int n,q,m[NMAX][NMAX],ans[QMAX];
bool used[NMAX][NMAX], usedq[QMAX];
vector <int> waiting[NMAX][NMAX];
vector <pairINT> query[NMAX][NMAX];
priority_queue <pairINT> pq;
int dx[]={0,1,0,-1};
int dy[]={1,0,-1,0};

bool inside(int,int);

int main(){
    int maxx=0,x,y,a,b;
    fin>>n>>q;
    for(int i=1;i<=n;++i)
        for(int j=1;j<=n;++j){
            fin>>m[i][j];
            if(m[i][j]>maxx){
                maxx=m[i][j];
                while(!pq.empty())pq.pop();
            }
            if(m[i][j] == maxx){
                pq.push({maxx, {i, j}});
            }
        }
    for(int i=0;i<q;++i){
        fin>>x>>y>>a>>b;
        query[x][y].pb({i, {a, b}});
        query[a][b].pb({i, {x, y}});
    }
    while(!pq.empty()){
        x=pq.top().sd.ft;
        y=pq.top().sd.sd;

        for(auto it:waiting[x][y]){
            ans[it]=pq.top().ft;
        }
        for(auto it:query[x][y]){
            if(!usedq[it.ft]){
                waiting[it.sd.ft][it.sd.sd].pb(it.ft);
                usedq[it.ft]=1;
            }
        }
        pq.pop();

        for(int i=0;i<4;++i){
            if(inside(x+dx[i], y+dy[i]) && !used[x+dx[i]][y+dy[i]]){
                used[x+dx[i]][y+dy[i]]=1;
                pq.push({min(m[x+dx[i]][y+dy[i]], m[x][y]), {x+dx[i], y+dy[i]}});
            }
        }
    }
    for(int i=0;i<q;++i)
        fout<<ans[i]<<'\n';
    return 0;
}
bool inside(int x,int y){
    if(x>0 && x<=n && y>0 && y<=n)
        return 1;
    return 0;
}