Cod sursa(job #965162)

Utilizator geniucosOncescu Costin geniucos Data 23 iunie 2013 16:19:56
Problema Matrice 2 Scor 15
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.45 kb
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
int stop,fin,prec,x1,y11,x2,y2,v1,v2,po,val,nr,i,j,k,n,Q,ras[20013],cod[309][309],t[90009],adev[90009],x[20013],y[20013],how[20013];
int dx[]={-1,1,0,0};
int dy[]={0,0,-1,1};
char sir[300*8+10];
vector < int > v[90009],init;
vector < int > ::iterator itt;
struct str
{
    int v,p;
};
str a[90009];
bool cmp(str a,str b)
{
    return a.v<b.v;
}
int tata(int x)
{
    if(t[x]!=x) t[x]=tata(t[x]);
    return t[x];
}
void ok(int val,vector < int > vv)
{
    memset(t,0,sizeof(t));
    for(i=1;a[i].v>=val&&i<=nr;i++)
        t[a[i].p]=a[i].p;
    for(i=1;a[i].v>=val&&i<=nr;i++)
        for(itt=v[a[i].p].begin();itt!=v[a[i].p].end();itt++)
            if(tata(*itt)!=tata(a[i].p)&&tata(*itt)!=0) t[tata(a[i].p)]=*itt;
    for(itt=vv.begin();itt!=vv.end();itt++)
    {
        x1=tata(x[*itt]);
        y11=tata(y[*itt]);
        if(x1==y11&&x1!=0)
        {
            how[*itt]=1;
            ras[*itt]=val;
        }
        else how[*itt]=0;
    }
}
void bs(int st,int dr,vector < int > vv)
{
    if(st>dr) return ;
    vector < int > hh[2];
    int mij=(st+dr)>>1;
    ok(mij,vv);
    for(itt=vv.begin();itt!=vv.end();itt++)
        hh[how[*itt]].push_back(*itt);
    bs(st,mij-1,hh[0]);
    bs(mij+1,dr,hh[1]);
}
int main()
{
freopen("matrice2.in","r",stdin);
freopen("matrice2.out","w",stdout);
scanf("%d",&n);
scanf("%d\n",&Q);
for(i=1;i<=n;i++)
    for(j=1;j<=n;j++)
    {
        nr++;
        cod[i][j]=nr;
    }
for(i=1;i<=n;i++)
    for(j=1;j<=n;j++)
        for(k=0;k<4;k++)
            if(cod[i+dx[k]][j+dy[k]]!=0) v[cod[i][j]].push_back(cod[i+dx[k]][j+dy[k]]);
nr=0;
for(i=1;i<=n;i++)
{
    gets(sir+1);
    po=1;
    for(j=1;j<=n;j++)
    {
        val=0;
        while(sir[po]>='0'&&sir[po]<='9')
        {
            val=val*10+sir[po]-48;
            po++;
        }
        nr++;
        a[nr].p=nr;
        a[nr].v=val;
        po++;
    }
}
for(i=1;i<=Q;i++)
{
    scanf("%d",&x1);
    scanf("%d",&y11);
    scanf("%d",&x2);
    scanf("%d",&y2);
    x[i]=cod[x1][y11];
    y[i]=cod[x2][y2];
}
sort(a+1,a+nr+1,cmp);
val=0;
prec=0;
for(i=1;i<=nr;i++)
{
    if(a[i].v!=prec) val++;
    prec=a[i].v;
    adev[val]=a[i].v;
    a[i].v=val;
}
reverse(a+1,a+nr+1);
for(i=1;i<=Q;i++)
    init.push_back(i);
bs(1,val,init);
for(i=1;i<=Q;i++)
    printf("%d\n",adev[ras[i]]);
return 0;
}