Cod sursa(job #1053557)

Utilizator scipianusFMI Ciprian Olariu scipianus Data 12 decembrie 2013 20:21:01
Problema Matrice 2 Scor 40
Compilator cpp Status done
Runda Teme Pregatire ACM Unibuc 2013 Marime 2.21 kb
#include<fstream>
#include<vector>
#include<cmath>
using namespace std;
int n,T,mat[310][310],valmax,sol[20100];
struct Pozitie{int x,y;};
vector <Pozitie> G[1000100];
struct Query{int xs,ys,xf,yf;};
Query Q[20100];
int dx[]={1,0,-1,0};
int dy[]={0,1,0,-1};
int tata[100100],h[100100];
bool viz[310][310];
vector <int> q[2];
 
inline int Find(int x)
{
    int r=x;
    while(tata[r])
        r=tata[r];
    int y=x,aux;
    while(y!=r)
    {
        aux=tata[y];
        tata[y]=r;
        y=aux;
    }
    return r;
}
 
inline void Union(int x,int y)
{
    if(h[x]>h[y])
        tata[y]=x;
    else
    {
        tata[x]=y;
        if(h[x]==h[y])
            h[y]++;
    }
}
 
int main()
{
    int i,j,k,x,y,A,B,p;
    Pozitie aux;
    ifstream fin("matrice2.in");
    fin>>n>>T;
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=n;j++)
        {
            fin>>mat[i][j];
            aux.x=i;
            aux.y=j;
            G[mat[i][j]].push_back(aux);
            valmax=max(valmax,mat[i][j]);
        }
    }
    for(i=1;i<=T;i++)
    {
        fin>>Q[i].xs>>Q[i].ys>>Q[i].xf>>Q[i].yf;
        q[0].push_back(i);
    }
    fin.close();
     
    p=0;
    for(k=valmax;k>0;k--)
    {
        if(G[k].size()==0)
            continue;
        for(i=G[k].size()-1;i>=0;i--)
        {
            aux=G[k][i];
            viz[aux.x][aux.y]=true;
            for(j=0;j<4;j++)
            {
                x=aux.x+dx[j];
                y=aux.y+dy[j];
                if(x>0 && x<=n && y>0 && y<=n && viz[x][y])
                {
                    A=Find(x*n+y);
                    B=Find(aux.x*n+aux.y);
                    if(A!=B)
                        Union(A,B);
                }
            }
        }
        for(i=q[p].size()-1;i>=0;i--)
        {
            A=Find(Q[q[p][i]].xs*n+Q[q[p][i]].ys);
            B=Find(Q[q[p][i]].xf*n+Q[q[p][i]].yf);
            if(A==B)
                sol[q[p][i]]=k;
            else
                q[1-p].push_back(q[p][i]);
        }
        q[p].clear();
        p=1-p;
    }
     
    ofstream fout("matrice2.out");
    for(i=1;i<=T;i++)
        fout<<sol[i]<<"\n";
    fout.close();
    return 0;
}