Pagini recente » Istoria paginii runda/threedays_ultimate_challenge/clasament | Profil M@2Te4i | Statistici sergiu sotoc (se_ssuper) | Cod sursa (job #1350271) | Cod sursa (job #1293893)
#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],y1[20005],x2[20005],y2[20005],eq[90005],dad[90005];
int d[90005],kd,use[20005],nums[90005],kn,ord,nr,last[20005];
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 El(int i,int j)
{ return ((i-1)*n)+j; }
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[Gr(El(i-1,j))]=ind;
if (a[i][j-1]>=mnval) dad[Gr(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;
}
Norm();
for(i=1;i<=m;i++)
{ f>>x1[i]>>y1[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],y1[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<<dr[i]<<"\n";
return 0;
}