Cod sursa(job #1875607)

Utilizator pepsiM4A1Ozturk Arif pepsiM4A1 Data 11 februarie 2017 13:00:25
Problema Matrice 2 Scor 0
Compilator cpp Status done
Runda Teme Pregatire ACM Unibuc 2013 Marime 2.75 kb
#include <cstdio>
#include <algorithm>
using namespace std;
const int pmax=90023,nmax=323,qmax=10023;
int v[nmax][nmax],vis[nmax][nmax],tata[pmax],ct[pmax],cine[nmax][nmax],ind,sol[qmax];
int px[]={1,-1,0,0},py[]={0,0,1,-1};
struct s1
{
    int p1;
    int p2;
    int p3;
    int p4;
    int baza;
    int pos;
}qr[qmax];
int comps1(const s1 &a,const s1 &b)
{
    return a.baza>b.baza;
}
struct s2
{
    int p1;
    int p2;
    int val;
}vls[pmax];
int comps2(const s2 &a,const s2&b)
{
    return a.val<b.val;
}
int n,q,m;
void reset_dads()
{
    for(int i=1;i<=m;i++) ct[i]=0,tata[i]=0;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++) vis[i][j]=0;
    }
}
int tabs(int a)
{
    while(tata[a]!=0)
    {
        if(tata[a]==a) return a;
        a=tata[a];
    }
    return a;
}
void connect(int a,int b)
{
    a=tabs(a),b=tabs(b);
    if(a==b) return;
    if(ct[a]>=ct[b])
    {
        tata[b]=a;
        ct[a]=max(ct[a],ct[b]+1);
    }
    else
    {
        tata[a]=b;
        ct[b]=max(ct[b],ct[a]+1);
    }
}
void go_to(int nr)
{
    while(1)
    {
      //  if(nr==8) printf("AA%d %d\n",vls[ind].val,ind);
        if(ind==0||vls[ind].val<nr) break;
        vis[vls[ind].p1][vls[ind].p2]=1;
        for(int i=0;i<4;i++)
        {
            int pa=vls[ind].p1+px[i],pb=vls[ind].p2+py[i];
            if(vis[pa][pb]==1) connect(cine[vls[ind].p1][vls[ind].p2],cine[pa][pb]);
        }
        --ind;
    }
}
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",&v[i][j]);
            vls[++m].p1=i,vls[m].p2=j,vls[m].val=v[i][j];
            cine[i][j]=m;
          //  printf("%d ",cine[i][j]);
        }
      //  printf("\n");
    }
    for(int i=1;i<=q;i++)
    {
        scanf("%d%d%d%d",&qr[i].p1,&qr[i].p2,&qr[i].p3,&qr[i].p4);
        qr[i].pos=i;
    }
    sort(vls+1,vls+m+1,comps2);
    for(int br=3;br>=0;--br)
    {
        sort(qr+1,qr+q+1,comps1);
        reset_dads(),ind=m;
        for(int i=1;i<=q;i++)
        {
            go_to(qr[i].baza+(1<<br));
         /*   printf("%d\n",qr[i].baza+(1<<br));
            for(int j=1;j<=n;j++)
            {
                for(int k=1;k<=n;k++) printf("%d ",vis[j][k]);
                printf("\n");
            }
            printf("%d %d %d %d",qr[i].p1,qr[i].p2,qr[i].p3,qr[i].p4);
         */   if(tabs(cine[qr[i].p1][qr[i].p2])==tabs(cine[qr[i].p3][qr[i].p4])){/*printf("+%d",1<<br);*/ qr[i].baza+=(1<<br);}
           // printf("\n");
        }
    }
    for(int i=1;i<=q;i++) sol[qr[i].pos]=qr[i].baza;
    for(int i=1;i<=q;i++) printf("%d\n",sol[i]);
}