Cod sursa(job #2683281)

Utilizator etienAndrone Stefan etien Data 10 decembrie 2020 20:10:56
Problema Matrice 2 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.63 kb
#include<bits/stdc++.h>
using namespace std;
ifstream fin("matrice2.in");
ofstream fout("matrice2.out");
int mat[301][301];
bool bl[301][301];
#define pii pair<int,int>
vector<pair<int,pair<int,int>>>val;
int n,i,j,q,r[20001],valoare;
set<pii>s[301][301];
pair<int,int>t[301][301];
int dl[4]={0,1,0,-1};
int dc[4]={1,0,-1,0};
pii rep(pii x)
{
    if(t[x.first][x.second]==make_pair(0,0))
        return x;
    t[x.first][x.second]=rep(t[x.first][x.second]);
    return t[x.first][x.second];
}
void join(pii x,pii y)
{
    x=rep(x);
    y=rep(y);
    if(s[x.first][x.second].size()>s[y.first][y.second].size())
    {
        swap(x,y);
    }
    t[x.first][x.second]=y;
    auto q=s[x.first][x.second].begin();
    for(auto q:s[x.first][x.second])
    {
        if(q.second==1)
        {
            if(s[y.first][y.second].find(make_pair(q.first,2))!=s[y.first][y.second].end())
            {
                r[q.first]=valoare;
                s[x.first][x.second].erase(q);
                s[y.first][y.second].erase({q.first,2});
            }
            else
            {
                 s[y.first][y.second].insert(q);
                 s[x.first][x.second].erase(q);
            }
        }
        else
        {
            if(s[y.first][y.second].find({q.first,1})!=s[y.first][y.second].end())
            {
                r[q.first]=valoare;
                s[x.first][x.second].erase(q);
                s[y.first][y.second].erase({q.first,1});
            }
            else
            {
                s[y.first][y.second].insert(q);
                s[x.first][x.second].erase(q);
            }
        }
        if(s[x.first][x.second].size()==0)
            break;
    }
}
int main()
{
    fin>>n>>q;
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
        {
            fin>>mat[i][j];
            bl[i][j]=true;
            val.push_back({mat[i][j],{i,j}});
        }
    for(i=1;i<=q;i++)
    {
        int x1,x2,y1,y2;
        fin>>x1>>y1>>x2>>y2;
        s[x1][y1].insert({i,1});
        s[x2][y2].insert({i,2});
    }
    sort(val.begin(),val.end());
    for(int i=val.size()-1;i>=0;i--)
    {
        pair<int,pair<int,int>>q=val[i];
        valoare=val[i].first;
        bl[q.second.first][q.second.second]=false;
        for(int k=0;k<4;k++)
        {
            int l=q.second.first+dl[k];
            int c=q.second.second+dc[k];
            if(l>=1&&l<=n&&c>=1&&c<=n&&rep({val[i].second})!=rep({l,c})&&!bl[l][c])
            {
                join(val[i].second,make_pair(l,c));
            }
        }
    }
    for(int i=1;i<=q;i++)
        fout<<r[i]<<"\n";
}