Pagini recente » Cod sursa (job #202980) | Rating ionescustefan (emberrom) | Cod sursa (job #3241256) | Cod sursa (job #2189769) | Cod sursa (job #1293898)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;
ifstream f("matrice2.in");
ofstream g("matrice2.out");
struct vec
{ int x,y; } v[90005];
int n,m,k,a[305][305],st[20005],dr[20005],x1[20005],yy1[20005],x2[20005],y2[20005],eq[90005],dad[90005];
int d[90005],kd,use[20005],nums[90005],kn,ord,nr,last[20005];
int el[305][305];
vector <int> pos[90005];
bool comp(vec p1,vec p2)
{ return a[p1.x][p1.y]<a[p2.x][p2.y]; }
void Norm()
{ int i;
sort(v+1,v+k+1,comp);
ord=0;
for(i=1;i<=k;i++)
{
if (a[v[i].x][v[i].y]>a[v[i-1].x][v[i-1].y]) ord++;
eq[ord]=a[v[i].x][v[i].y];
a[v[i].x][v[i].y]=ord;
}
}
int Gr(int x)
{ int i,kd=0;
while(dad[x]!=x)
{ kd++; d[kd]=x;
x=dad[x];
}
for(i=1;i<=kd;i++)
dad[d[i]]=x;
return x;
}
void Solve(int mnval)
{ int i,j,ind=0;
memset(dad,0,sizeof(dad));
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{ ind++; dad[ind]=ind;
if (a[i][j]>=mnval)
{
if (a[i-1][j]>=mnval) dad[el[i-1][j]]=ind;
if (a[i][j-1]>=mnval) dad[el[i][j-1]]=ind;
}
dad[el[i][j]]=ind;
}
}
int main()
{ int i,j,p,mid,stp;
f>>n>>m;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{ f>>a[i][j];
k++; v[k].x=i; v[k].y=j;
el[i][j]=(i-1)*n+j;
}
Norm();
for(i=1;i<=m;i++)
{ f>>x1[i]>>yy1[i]>>x2[i]>>y2[i];
st[i]=1; dr[i]=ord;
}
for(;;)
{
stp=1; kn=0;
memset(use,0,sizeof(use));
for(i=1;i<=m;i++)
{
if (st[i]<=dr[i])
{ mid=(st[i]+dr[i])/2;
stp=0;
if (!use[mid]) {kn++; nums[kn]=mid; use[mid]=1;}
pos[mid].push_back(i);
}
}
for(i=1;i<=kn;i++)
{ nr=nums[i];
Solve(nr);
for(j=0;j<pos[nr].size();j++)
{ p=pos[nr][j];
if ( Gr(el[x1[p]][yy1[p]]) == Gr(el[x2[p]][y2[p]]) )
{st[p]=((st[p]+dr[p])/2)+1;
last[p]=1;
}
else
{dr[p]=((st[p]+dr[p])/2)-1;
last[p]=0;
}
}
while(pos[nr].size())
pos[nr].pop_back();
}
if (stp) break;
}
for(i=1;i<=m;i++)
g<<eq[dr[i]]<<"\n";
return 0;
}