Cod sursa(job #1347271)

Utilizator misinozzz zzz misino Data 18 februarie 2015 21:20:32
Problema Matrice 2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.9 kb
#include<fstream>
#include<algorithm>
#include<cstring>

#define N 310
#define Q 20100
#define x first
#define y second

using namespace std;

ifstream f("matrice2.in");
ofstream g("matrice2.out");

int i,j,q,n,nr,m,k,t[N * N],b[N][N],a[N][N],sol[Q];

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

pair<int,int>v[N * N];

struct query{int x,y,x1,y1,p;}qu[Q];

inline bool cmp(pair<int,int>aa,pair<int,int>b){
    return a[aa.x][aa.y] > a[b.x][b.y];
}

inline bool cmp1(query x,query y){
    return sol[x.p] > sol[y.p];
}

inline int tata(int x){
    if(t[x] == x)
        return t[x];
    return t[x] = tata(t[x]);
}

inline void uneste(int x,int y){
    t[y] = x;
}

int main()
{
    f >> n >> q;

    for(i = 1; i <= n; ++i)
        for(j = 1; j <= n; ++j)
        {
            f >> a[i][j];
            v[++nr].x = i;
            v[nr].y = j;
        }
    sort(v + 1, v + nr + 1, cmp);

    for(i = 1; i <= q; ++i)
    {
        f >> qu[i].x >> qu[i].y >> qu[i].x1 >> qu[i].y1;
        qu[i].p = i;
    }

    for(k = 20; k >= 0; --k)
    {
        sort(qu + 1, qu + q + 1, cmp1);
        memset(b, 0, sizeof(b));
        for(i = 1; i <= nr; ++i)
            t[i] = i;

        for(i = j = 1, m = 0; j <= q; ++j)
        {
            while(i <= nr && sol[qu[j].p] + (1 << k) <= a[v[i].x][v[i].y])
            {
                b[v[i].x][v[i].y] = ++m;

                for(int di = 0; di <= 3; ++di)
                    if(b[v[i].x + dx[di]][v[i].y + dy[di]])
                        uneste(tata(b[v[i].x][v[i].y]), tata(b[v[i].x + dx[di]][v[i].y + dy[di]]));
                ++i;
            }

            if(tata(b[qu[j].x][qu[j].y]) == tata(b[qu[j].x1][qu[j].y1]) && tata(b[qu[j].x1][qu[j].y1]))
                sol[qu[j].p] += (1 << k);
        }
    }

    for(i = 1; i <= q; ++i)
        g << sol[i] << '\n';

    return 0;
}