Cod sursa(job #1423788)

Utilizator heracleRadu Muntean heracle Data 22 aprilie 2015 18:33:42
Problema Matrice 2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.69 kb
#include <cstdio>
#include <algorithm>
#include <cstring>

FILE* in=fopen("matrice2.in","r");
FILE* out=fopen("matrice2.out","w");

const int Q=307,W=20007;

int n,q;

int v[Q][Q],who[Q][Q];

struct tipe
{
    int x,y;
    int val;

    bool operator <(const tipe &alt) const
    {
        return val>alt.val;
    }
} t[Q*Q];

int up[Q*Q], s[Q*Q],lst=0;

void uita()
{
    memset(up,0,sizeof up);
    memset(s,0,sizeof s);
    lst=1;
}

int uper(int x)
{
    if(up[x]==0)
        return x;
    up[x]=uper(up[x]);
    return up[x];
}

void unioni(int a, int b)
{
    if(a==b)
        return;

   // a=uper(a);
   // b=uper(b);

    if(s[a]>s[b])
        up[b]=a;
    else if(s[a]<s[b])
        up[a]=b;
    else
    {
        s[a]++;
        up[b]=a;
    }
}

int dx[]={0,1,0,-1};
int dy[]={1,0,-1,0};

void uneste(int act)
{
    for(lst; lst<=act; lst++)
    {
        s[who[t[lst].x][t[lst].y]]=1;
        for(int k=0; k<4; k++)
        {
            if(who[t[lst].x+dx[k]][t[lst].y+dy[k]] < who[t[lst].x][t[lst].y] )
            {
                unioni(uper(who[t[lst].x+dx[k]][t[lst].y+dy[k]]),(uper(who[t[lst].x][t[lst].y])));
            }
        }
    }
}

struct query{
    int x,y,X,Y;
    int cont;
    int rez;

    bool operator <(const query &alt) const
    {
        return rez<alt.rez;
    }
} r[W];

bool cmp21(const query &a, const query &b)
{
    return a.cont<b.cont;
}

void pre_proc()
{
    std::sort(t+1,t+n*n+1);

    for(int i=1; i<=n*n; i++)
    {
        who[t[i].x][t[i].y]=i;
    }

    int nxt=1;

    for(int t=16; t>=0; t--)
    {
        int part=1<<t;

        nxt=1;

        for(int act=part; act<=n*n; act+=part)
        {
            uneste(act);

            while(nxt<=q && r[nxt].rez<act)
            {
                if(uper(who[r[nxt].x][r[nxt].y])!=uper(who[r[nxt].X][r[nxt].Y]) )
                {
                    r[nxt].rez=act;
                }
                nxt++;
            }

        }


        std::sort(r+1,r+q+1);
        uita();
    }

    std::sort(r+1,r+q+1,cmp21);

    for(int i=1; i<=q; i++)
    {
        fprintf(out,"%d\n",t[r[i].rez+1].val);
    }

}

void read()
{
    fscanf(in,"%d%d",&n,&q);

    for(int i=1; i<=n; i++)
    {
        for(int j=1; j<=n; j++)
        {
            fscanf(in,"%d",&v[i][j]);
            t[(i-1)*n+j].x=i;
            t[(i-1)*n+j].y=j;
            t[(i-1)*n+j].val=v[i][j];
        }

        for(int i=1; i<=n; i++)
        {
            who[i][0]=Q*Q;
            who[i][n+1]=Q*Q;
            who[0][i]=Q*Q;
            who[n+1][i]=Q*Q;
        }
    }

    for(int i=1; i<=q; i++)
    {
        fscanf(in,"%d%d%d%d", &r[i].x, &r[i].y, &r[i].X, &r[i].Y);
        r[i].cont=i;
    }


}

int main()
{
    read();
    pre_proc();
    return 0;
}