Cod sursa(job #2401174)

Utilizator savulescustefanSavulescu Stefan savulescustefan Data 9 aprilie 2019 14:33:38
Problema Matrice 2 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.19 kb
#include <cstdio>
#include <utility>
#include <algorithm>
using namespace std;
pair <int,int> f[20004],v[90004];
int n,q,i,j,x,y,z,t,m,nr,a[20004],b[20004],c[20004],d[20004],s[20004],p[90004],r[90004],e[304][304];
int nr1 (int x, int y)
{
    int z;
    z=(x-1)*n;
    z+=y;
    return z;
}
int pr (int x)
{
    while (x!=p[x])
        x=p[x];
    return x;
}
void ve (int x, int y)
{
    z=nr1(x,y);
    z=pr(z);
    t=pr(t);
    if (z!=t)
    {
        if (r[z]>r[t])
            p[t]=z;
        else if (r[z]<r[t])
            p[z]=t;
        else
        {
            p[t]=z;
            r[z]++;
        }
    }
    return;
}
void u (int x)
{
    y=(x-1)%n;
    y++;
    x-=y;
    x/=n;
    x++;
    t=nr1(x,y);
    if (e[x-1][y]>e[x][y])
        ve(x-1,y);
    if (e[x][y-1]>e[x][y])
        ve(x,y-1);
    if (e[x][y+1]>=e[x][y])
        ve(x,y+1);
    if (e[x+1][y]>=e[x][y])
        ve(x+1,y);
    return;
}
int main()
{
    freopen ("matrice2.in","r",stdin);
    freopen ("matrice2.out","w",stdout);
    scanf ("%d %d", &n, &q);
    nr=0;
    for (i=1;i<=n;i++)
        for (j=1;j<=n;j++)
        {
            scanf ("%d", &e[i][j]);
            v[++nr].first=e[i][j];
            v[nr].second=nr;
        }
    sort (v+1,v+nr+1);
    reverse (v+1,v+nr+1);
    for (i=1;i<=q;i++)
    {
        scanf ("%d %d %d %d", &a[i], &b[i], &c[i], &d[i]);
        s[i]=0;
    }
    m=1<<19;
    while (m>=1)
    {
        for (i=1;i<=q;i++)
        {
            f[i].first=s[i]+m;
            f[i].second=i;
        }
        for (i=1;i<=nr;i++)
        {
            p[i]=i;
            r[i]=1;
        }
        sort (f+1,f+q+1);
        reverse (f+1,f+q+1);
        j=1;
        for (i=1;i<=q;i++)
        {
            while ((v[j].first>=f[i].first) && (j<=nr))
            {
                u(v[j].second);
                j++;
            }
            z=f[i].second;
            x=nr1(a[z],b[z]);
            y=nr1(c[z],d[z]);
            x=pr(x);
            y=pr(y);
            if (x==y)
                s[z]+=m;
        }
        m/=2;
    }
    for (i=1;i<=q;i++)
        printf ("%d\n", s[i]);
    return 0;
}