Cod sursa(job #2400838)

Utilizator alexilasiAlex Ilasi alexilasi Data 9 aprilie 2019 10:10:11
Problema Matrice 2 Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.13 kb
#include <bits/stdc++.h>

#define pii pair <int, int>
#define piii pair <int, pii>
#define f first
#define s second

using namespace std;

ifstream fin ("matrice2.in");
ofstream fout ("matrice2.out");

const int nMax = 310, qMax = 20010;

struct query{int x1, x2, y1, y2, o, ans;};

int n, q, i, j, x, k, valc;
int findd[nMax][nMax], t[nMax*nMax];
int dx[] = {0, 0, 1, -1}, dy[] = {1, -1, 0, 0};
piii a[nMax*nMax];
query Q[qMax];

inline bool cmp(piii a, piii b)
{
    return a.f > b.f;
}

inline bool cmpq(query a, query b)
{
    return a.ans > b.ans;
}

inline bool cmpo(query a, query b)
{
    return a.o < b.o;
}

inline bool check(int l, int c)
{
    return (l>=1 && c>=1 && l<=n && c<=n);
}

int getTata(int nod)
{
    if(t[nod] == nod) return nod;
    t[nod] = getTata(t[nod]);
    return t[nod];
}

void unite(int a, int b)
{
    t[getTata(a)] = getTata(b);
}

void baga(int x, int val)
{
    for(int i=0; i<4; i++)
    {
        int l = a[x].s.f + dx[i];
        int c = a[x].s.s + dy[i];
        if(check(l, c) && a[findd[l][c]].f >= val)
            unite(x, findd[l][c]);
    }
}

int main()
{
    fin >> n >> q;
    for(i=1; i<=n; i++)
        for(j=1; j<=n; j++)
        {
            x = (i-1) * n + j;
            fin >> a[x].f;
            a[x].s.f = i;
            a[x].s.s = j;
        }
    sort(a+1, a+n*n+1, cmp);
    for(i=1; i<=n*n; i++)
        findd[a[i].s.f][a[i].s.s] = i;
    for(i=1; i<=q; i++)
    {
        fin >> Q[i].x1 >> Q[i].y1 >> Q[i].x2 >> Q[i].y2;
        Q[i].o = i;
    }

    for(j=1<<20; j; j>>=1)
    {
        for(i=1; i<=n*n; i++) t[i] = i;
        sort(Q+1, Q+q+1, cmpq);
        k=1;
        for(i=1; i<=q; i++)
        {
            valc = Q[i].ans + j;
            for(; k <= n*n && a[k].f >= valc; k++)
                baga(k, valc);
            int p1 = findd[Q[i].x1][Q[i].y1];
            int p2 = findd[Q[i].x2][Q[i].y2];
            if(getTata(p1) == getTata(p2))
                Q[i].ans += j;
        }
    }

    sort(Q+1, Q+q+1, cmpo);

    for(i=1; i<=q; i++)
        fout << Q[i].ans << " ";

    return 0;
}