Cod sursa(job #1234183)

Utilizator marcelPFake name marcelP Data 26 septembrie 2014 21:22:37
Problema Matrice 2 Scor 75
Compilator cpp Status done
Runda Teme Pregatire ACM Unibuc 2013 Marime 2.4 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <cstdlib>
using namespace std;
ifstream fin("matrice2.in");
ofstream fout("matrice2.out");
#define MAXN 301
#define MAXM 20001

int n;
struct el{
    int i, j, val;
};
struct query{
    int x1, x2, y1, y2, val, ind;
};
inline int p(int a, int b)
{
    return (a - 1) * n + b;
}
el a[MAXN*MAXN];
query q[MAXM];

inline bool cmp1(el a, el b)
{
    return a.val<b.val;
}
inline bool cmp2(query a, query b)
{
    return a.val>b.val;
}
inline bool cmp3(query a, query b)
{
    return a.ind<b.ind;
}

int dr=0;
int md[MAXN*MAXN];
int dir[4][2] = { {0, 1}, {0, -1}, {1, 0}, {-1, 0} };
int b[MAXN][MAXN];
int m;
int dad(int a)
{
    if(a != md[a])
        md[a] = dad(md[a]);
    return md[a];
}

void unite(int a, int b)
{
    md[dad(a)] = dad(b);
}

void update(el a)
{
    for(int k = 0 ; k < 4 ; k++)
    {
        int ni = a.i + dir[k][0];
        int nj = a.j + dir[k][1];
        if(b[ni][nj] >= b[a.i][a.j])
            unite(p(ni, nj), p(a.i, a.j));
    }
}

void cautbin()
{
    int i, step;
    for(step = 1 ; step <= dr ; step <<= 1 );
    for(; step ; step >>= 1)
    {
        if(step <= dr)
        {
           // cout << step << " ";
            for(i = 1 ; i <= dr ; i++)
                md[i]=i;
            sort(q + 1, q + m + 1, cmp2);

            int ind = 1;
            while(a[ind].val + step > dr && ind <= m)
                ind++;
            for(i = dr ; i >= 1 ; i--)
            {
                update(a[i]);
                while(q[ind].val + step == i && ind <= m)
                {
                    if(dad(p(q[ind].x1, q[ind].y1)) == dad(p(q[ind].x2, q[ind].y2)))
                    {
                        q[ind].val+=step;

                    }
                    ind++;
                }
            }
        }
    }
}


int main()
{
    int i, j;
    fin>>n>>m;
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=n;j++)
        {
            fin>>a[++dr].val;
            b[i][j] = a[dr].val;
            a[dr].i = i;
            a[dr].j = j;
        }
    }
    for(i=1;i<=m;i++)
    {
        fin>>q[i].x1>>q[i].y1>>q[i].x2>>q[i].y2;
        q[i].ind=i;
    }
    sort(a+1, a+dr+1, cmp1);

    cautbin();
    sort(q + 1, q + m + 1, cmp3);
    for(i = 1 ; i <= m ; i++)
    {
        fout << a[q[i].val].val << "\n";
    }
}