Cod sursa(job #428076)

Utilizator irene_mFMI Irina Iancu irene_m Data 28 martie 2010 19:55:05
Problema Matrice 2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.74 kb
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#define infile "matrice2.in"
#define outfile "matrice2.out"
#define MaxN 324
#define MaxQ 200024

int a[MaxN][MaxN];
char uz[MaxN][MaxN];
int N,Q;
int x1[MaxQ],y1[MaxQ],x2[MaxQ],y2[MaxQ];
int sol[MaxQ];
int C[MaxN*MaxN],L;
int X[MaxN*MaxN],Y[MaxN*MaxN];
int poz[MaxN*MaxN],poz2[MaxN*MaxN],Query[MaxN*MaxN],G[MaxN*MaxN];
int dx[4]={0,0,1,-1}, dy[4]={1,-1,0,0};

int cmp(int x,int y)
{
      return C[x]>C[y];
}

int cmp2(int x,int y)
{
      return Query[x]>Query[y];
}

int tata(int nod)
{
      if(nod!=G[nod])
            G[nod]=tata(G[nod]);
      return G[nod];
}

void read()
{
      int i,j;
      scanf("%d%d",&N,&Q);
      for(i=1;i<=N;i++)
            for(j=1;j<=N;j++)
            {
                  L++;
                  a[i][j]=L;
                  X[L]=i; Y[L]=j;
                  scanf("%d",&C[L]);
                  poz[L]=L;
            }

      for(i=1;i<=Q;i++)
            scanf("%d%d%d%d",&x1[i],&y1[i],&x2[i],&y2[i]);
}

void solve()
{
      std::sort(poz+1,poz+L+1,cmp);

      int h,i,p,j,k,xc,yc;
      for(h=1;h<=C[poz[1]];h<<=1) ;

      for(;h;h>>=1)
      {
            for(i=1;i<=Q;i++)
            {
                  Query[i]=sol[i]+h;
                  poz2[i]=i;
            }

            std::sort(poz2+1,poz2+Q+1,cmp2);

            for(i=1;i<=L;i++)
                  G[i]=i;

            for(i=1;i<=N;i++)
                  for(j=1;j<=N;j++)
                        uz[i][j]=0;

            i=j=1;
            while(i<=L)
            {
                  for(k=j; j<=Q && Query[poz2[j]]>C[poz[i]];j++)
                        if(tata(a[x1[poz2[j]]][y1[poz2[j]]])==tata(a[x2[poz2[j]]][y2[poz2[j]]]))
                              sol[poz2[j]]+=h;

                  for(k=i;i<=L && C[poz[i]]==C[poz[k]];i++)
                  {
                        uz[X[poz[i]]][Y[poz[i]]]=1;

                        for(p=0;p<4;p++)
                        {
                              xc=X[poz[i]]+dx[p]; yc=Y[poz[i]]+dy[p];

                              if(xc>0 && yc>0 && xc<=N && yc<=N && uz[xc][yc])
                                    G[G[tata(a[xc][yc])]]=G[poz[i]];
                        }
                  }
            }

            for(;j<=Q;j++)
                  if(tata(a[x1[poz2[j]]][y1[poz2[j]]])==tata(a[x2[poz2[j]]][y2[poz2[j]]]))
                              sol[poz2[j]]+=h;
      }
}


void write()
{
      int i;
      for(i=1;i<=Q;i++)
            printf("%d\n",sol[i]);
}

int main()
{
      freopen(infile,"r",stdin);
      freopen(outfile,"w",stdout);

      read();
      solve();
      write();

      fclose(stdin);
      fclose(stdout);
      return 0;
}