Cod sursa(job #321922)

Utilizator GavrilaVladGavrila Vlad GavrilaVlad Data 7 iunie 2009 19:47:52
Problema Matrice 2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.57 kb
#include <stdio.h>
#include <algorithm>
#include <string.h>

using namespace std;

#define maxn 310
#define maxq 20010

struct punct
{
    long x;
    long y;
    long id;
};

struct querry
{
    punct p1;
    punct p2;
    long id;
    long val;
};

long n, i, j, k, poz, q, l, p1, p2, put;
punct p[maxn*maxn];
querry w[maxq];
long tata[maxn*maxn], ok[maxn*maxn], sol[maxq];
long m[maxn][maxn], ind[maxn][maxn], fol[maxn][maxn];

const long d1[]={0, -1, 0, 1};
const long d2[]={-1, 0, 1, 0};

inline int cmp(punct a, punct b)
{
    return m[a.x][a.y]>m[b.x][b.y];
}

inline int cmp2(querry a, querry b)
{
    return a.val>b.val;
}

void c_conexe()
{
    long i, j, x, y, xx, yy, nod, aux, pq, pz, tata1, tata2;
    memset(fol, 0, sizeof(fol));
    for(i=1; i<=n*n; i++)
    {
        tata[i]=i;
    }
    pq=1;
    for(i=1; i<=n*n; i++)
    {
        pz=i;
        while(m[p[pz].x][p[pz].y]==m[p[i].x][p[i].y] && pz<=n*n)
        {
       //     printf("%d ", pz);
      //      printf("%d %d\n", p[pz].x, p[pz].y);
            
            fol[p[pz].x][p[pz].y]=1;
            
            for(j=0; j<4; j++)
            {
                xx=(p[pz].x)+d1[j];
                yy=(p[pz].y)+d2[j];
                if(xx && yy && xx<=n && yy<=n && fol[xx][yy])
                {
                    nod=ind[xx][yy];
                    while(tata[nod]!=nod)
                    {
                        aux=tata[nod];
                        tata[nod]=p[pz].id;
                        nod=aux;
                    }
                    tata[nod]=p[pz].id;
                }
            }
            pz++;
        }
   /*     for(x=1; x<=n; x++)
        {
            for(y=1; y<=n; y++)
            {
                nod=(x-1)*n+y;
                while(tata[nod]!=nod)
                {
                    nod=tata[nod];
                }
                printf("%d ", fol[x][y]);
            }
            printf("\n");
        }*/
            
        while(w[pq].val+(1<<put)>=m[p[i].x][p[i].y] && pq<=q)
        {
            tata1=ind[w[pq].p1.x][w[pq].p1.y];
            while(tata[tata1]!=tata1)
            {
                tata1=tata[tata1];
            }
            tata2=ind[w[pq].p2.x][w[pq].p2.y];
            while(tata[tata2]!=tata2)
            {
                tata2=tata[tata2];
            }
         //   printf("%d %d\n", tata1, tata2);
            if(tata1==tata2)
            {
                ok[pq]=1;
            }
            pq++;
        }
        i=pz-1;
    }
//    printf("\n");
}

int main()
{
    freopen("matrice2.in", "r", stdin);
    freopen("matrice2.out", "w", stdout);
    
    scanf("%d%d", &n, &q);
    for(i=1; i<=n; i++)
    {
        for(j=1; j<=n; j++)
        {
            scanf("%d", &m[i][j]);
            poz=(i-1)*n+j;
            ind[i][j]=poz;
            p[poz].x=i;
            p[poz].y=j;
            p[poz].id=poz;
        }
    }
    
    for(i=1; i<=q; i++)
    {
        scanf("%d%d%d%d", &w[i].p1.x, &w[i].p1.y, &w[i].p2.x, &w[i].p2.y);
        w[i].id=i;
    }
    
    sort(p+1, p+n*n+1, cmp);
    
    for(put=3; put>=0; put--)
    {
        sort(w+1, w+q+1, cmp2);
        memset(ok, 0, sizeof(ok));
        c_conexe();
        for(i=1; i<=q; i++)
        {
            if(ok[i])
            {
                w[i].val+=1<<put;
            }
        }
    }
    for(i=1; i<=q; i++)
    {
        sol[w[i].id]=w[i].val;
    }
    for(i=1; i<=q; i++)
    {
        printf("%d\n", sol[i]);
    }
    
    return 0;
}