Cod sursa(job #1159704)

Utilizator Daniel3717Aleca Daniel Adrian Daniel3717 Data 29 martie 2014 20:14:16
Problema Matrice 2 Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 4.14 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
#define maxn 305
#define inf 2000000000

vector <pair <int, pair <int,int> > > vm;
vector <pair <pair <int,int> , pair <int,int> > > q;
vector <pair <int,int> > v;
int n;
pair <int,int> dad[maxn][maxn];

pair <int,int> fdad(pair <int,int> p)
{
    int l,c;
    l=p.first;
    c=p.second;
    if (dad[l][c]==p)
        return p;
    dad[l][c]=fdad(dad[l][c]);
    return dad[l][c];
}

void showdad()
{
    int l,c;
    cout<<'\n';
    for (l=1;l<=n;l++)
    {
        for (c=1;c<=n;c++)
            cout<<" ("<<(fdad(dad[l][c])).first<<','<<(fdad(dad[l][c])).second<<") ";
        cout<<'\n';
    }
}

int axl[4] {1,0,0,-1};
int axc[4] {0,1,-1,0};

void step(int which)
{
    int ln,cn;
    ln=vm[which].second.first;
    cn=vm[which].second.second;
    dad[ln][cn]=make_pair(ln,cn);
    int i;
    int lt,ct,ld,cd;
    pair <int,int> p;
    //cout<<"\nS"<<ln<<' '<<cn<<' ';
    for (i=0;i<=3;i++)
    {
        lt=ln+axl[i];
        ct=cn+axc[i];
        //cout<<'C'<<lt<<' '<<ct<<"->";
        p=fdad(make_pair(lt,ct));
        ld=p.first;
        cd=p.second;
        //cout<<'C'<<ld<<' '<<cd<<' ';
        if (make_pair(0,0)!=make_pair(ld,cd))
        {
            //cout<<"BIND";
            dad[ld][cd]=make_pair(ln,cn);
        }
        //cout<<' ';
    }
}


void steps(int &laststep,int target)
{
    int i;
    for (i=laststep+1;(vm[i].first>=target)&&(i<vm.size());i++)
        step(i);
    laststep=i-1;
}


bool verify(pair <pair <int,int> , pair <int,int> > p)
{
    int l1,c1,l2,c2;
    l1=p.first.first;
    c1=p.first.second;
    l2=p.second.first;
    c2=p.second.second;
    if ((fdad(make_pair(l1,c1))==fdad(make_pair(l2,c2)))&&(fdad(make_pair(l1,c1))!=make_pair(0,0)))
        return true;
    return false;
}


void goinit()
{
    int l,c;
    for (l=0;l<=n+1;l++)
        for (c=0;c<=n+1;c++)
            dad[l][c].first=dad[l][c].second=0;
}


void go(int nr)
{
    goinit();
    int laststep,i,iax,now,target;
    laststep=0;

    vector <pair <int,int> > vmn,vmx;
    vector <pair <int,int> > vv;
    vmn.clear();vmx.clear();vv.clear();

    for (i=0;i<v.size();i++)
    {
        //showdad();
        now=v[i].first;
        target=now+nr;
        //cout<<target<<'\n';
        if (vm[laststep].first>target)
        {
            for (iax=0;iax<vmx.size();iax++)
                vv.push_back(vmx[iax]);
            for (iax=0;iax<vmn.size();iax++)
                vv.push_back(vmn[iax]);
            vmx.clear();
            vmn.clear();
            steps(laststep,target);
        }
        if (verify(q[v[i].second]))
            vmx.push_back(make_pair(v[i].first+nr,v[i].second));
        else
            vmn.push_back(v[i]);
    }

    for (iax=0;iax<vmx.size();iax++)
        vv.push_back(vmx[iax]);
    for (iax=0;iax<vmn.size();iax++)
        vv.push_back(vmn[iax]);

    v.clear();
    v=vv;
}


int nq,l,c,i,l1,c1,l2,c2,bit,ax;
int m[maxn][maxn];

int main(void)
{
    FILE * f;
    f=fopen("matrice2.in","r");
    ofstream g("matrice2.out");
    fscanf(f,"%d%d",&n,&nq);
    vm.push_back(make_pair(inf,make_pair(0,0)));
    for (l=1;l<=n;l++)
        for (c=1;c<=n;c++)
        {
            fscanf(f,"%d",&m[l][c]);
            vm.push_back(make_pair(m[l][c],make_pair(l,c)));
        }
    sort(vm.rbegin(),vm.rend());

    q.push_back(make_pair(make_pair(0,0),make_pair(0,0)));
    for (i=1;i<=nq;i++)
    {
        fscanf(f,"%d%d%d%d",&l1,&c1,&l2,&c2);
        q.push_back(make_pair(make_pair(l1,c1),make_pair(l2,c2)));
        v.push_back(make_pair(0,i));
    }


    for (bit=20;bit>=0;bit--)
    {
        //cout<<"\n\n"<<(1<<bit)<<'\n';
        go((1<<bit));
        //for (i=0;i<v.size();i++)
        //    cout<<v[i].first<<' '<<v[i].second<<'\n';
    }

    for (i=0;i<v.size();i++)
    {
        ax=v[i].first;
        v[i].first=v[i].second;
        v[i].second=ax;
    }

    sort(v.begin(),v.end());

    for (i=0;i<v.size();i++)
        g<<v[i].second<<'\n';

    g.close();
    return 0;
}