Cod sursa(job #1083805)

Utilizator the@EyE@Postavaru Stefan the@EyE@ Data 16 ianuarie 2014 13:56:52
Problema Matrice 2 Scor 100
Compilator cpp Status done
Runda Teme Pregatire ACM Unibuc 2013 Marime 2.37 kb
#include<stdio.h>
#include<vector>
#include<algorithm>

using namespace std;

struct question
{
    int x0,y0,x1,y1,ind,ras;
};

struct punct
{
    int x,y,ind;
};

int T[303*303],N,Q,mat[303][303];
vector<punct> puncte;
vector<question> questions;
int check[303][303];
int dx[]={-1,1,0,0};
int dy[]={0,0,-1,1};

bool cmp_puncte(punct p1,punct p2)
{
    return mat[p1.x][p1.y]>mat[p2.x][p2.y];
}

bool cmp_q(question q1,question q2)
{
    return q1.ras>q2.ras;
}

bool cmp_q2(question q1,question q2)
{
    return q1.ind<q2.ind;
}

int father(int X)
{
    if(T[X]==X)return X;
    T[X]=father(T[X]);
    return T[X];
}

void unite(int X,int Y)
{
    for(int i=0;i<4;++i)
        if(check[X+dx[i]][Y+dy[i]]>0)
            T[father(check[X][Y])]=T[father(check[X+dx[i]][Y+dy[i]])];
}

int main()
{
    freopen("matrice2.in","r",stdin);
    freopen("matrice2.out","w",stdout);
    scanf("%d%d",&N,&Q);
    for(int i=1;i<=N;++i)
        for(int j=1;j<=N;++j)
        {
            scanf("%d",&mat[i][j]);
            punct p;p.x=i;p.y=j;p.ind=(i-1)*N+j;
            puncte.push_back(p);
        }
     sort(puncte.begin(),puncte.end(),cmp_puncte);

     for(int i=0;i<Q;++i)
     {
        question q;
        scanf("%d%d%d%d",&q.x0,&q.y0,&q.x1,&q.y1);
        q.ind=i;q.ras=0;
        questions.push_back(q);
     }
     for(int k=19;k>=0;--k)
     {
         bool change=false;
         sort(questions.begin(),questions.end(),cmp_q);
         for(int i=1;i<=N;++i)
         {
            for(int j=1;j<=N;++j)check[i][j]=0;
         }
         for(int i=0;i<=N*N;++i)T[i]=i;
         int used=0;
         for(int j=0;j<Q;++j)
         {
             int m=questions[j].ras+(1<<k);
             while(used<N*N&&mat[puncte[used].x][puncte[used].y]>=m)
             {
                 check[puncte[used].x][puncte[used].y]=used+1;
                 unite(puncte[used].x,puncte[used].y);
                 ++used;
             }
             int father1=father(check[questions[j].x0][questions[j].y0]);
             int father2=father(check[questions[j].x1][questions[j].y1]);
             if(father1>0&&(father1==father2)){questions[j].ras=m;change=true;}
         }
       // if(!change)break;
     }
     sort(questions.begin(),questions.end(),cmp_q2);
     for(int i=0;i<Q;++i)printf("%d\n",questions[i].ras);
     return 0;
}