Pagini recente » Cod sursa (job #29831) | Cod sursa (job #25990) | Cod sursa (job #1775237) | Cod sursa (job #771834) | Cod sursa (job #1293954)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <functional>
#include <cstdlib>
#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],el[305][305],act;
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,initx=x;
while(dad[x]!=x)
{ kd++; d[kd]=x;
// if (initx==5) {cout<<dad[el[1][5]]; system("pause");}
x=dad[x];
}
for(i=1;i<=kd;i++)
dad[d[i]]=x;
return x;
}
void Solve(int mnval)
{ int i,j,ind;
for(i=act;i>0;i--)
{ ind=el[v[i].x][v[i].y];
// cout<<v[i].x<<" "<<v[i].y<<"\n";
if (a[v[i].x][v[i].y]>=mnval)
{
if (a[v[i].x-1][v[i].y]>=mnval) dad[Gr(el[v[i].x-1][v[i].y])]=Gr(ind);
if (a[v[i].x][v[i].y-1]>=mnval) dad[Gr(el[v[i].x][v[i].y-1])]=Gr(ind);
if (a[v[i].x+1][v[i].y]>=mnval) dad[Gr(el[v[i].x+1][v[i].y])]=Gr(ind);
if (a[v[i].x][v[i].y+1]>=mnval) dad[Gr(el[v[i].x][v[i].y+1])]=Gr(ind);
}
else break;
}
act=i;
}
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; act=k;
memset(use,0,sizeof(use));
memset(dad,0,sizeof(dad));
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
dad[el[i][j]]=el[i][j];
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);
}
}
sort(nums+1,nums+kn+1,greater<int>());
for(i=1;i<=kn;i++)
{ nr=nums[i];
//cout<<nums[i]<<" ";
Solve(nr);
// cout<<act;
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;
}