Pagini recente » Cod sursa (job #3242268) | Cod sursa (job #3265850) | Cod sursa (job #2060073) | Cod sursa (job #1659318) | Cod sursa (job #2876149)
#include <bits/stdc++.h>
#define pb push_back
#define ll long long
using namespace std;
ifstream f("matrice2.in");
ofstream g("matrice2.out");
int N,Q,dad[305*305];
int cod[305][305];
vector<int> adj[305*305];
int sz[305*305];
int cnt=0;
int dx[4]= {1,0,-1,0};
int dy[4]= {0,1,0,-1};
bool viz[305*305];
struct node
{
int val;
int cnt;
};
node v[305*305];
struct query
{
int x,y;
int ans;
int idx;
};
query q[20005],aux1[200005],aux2[200005];
void creategraph()
{
for(int i=1; i<=N; i++)
{
for(int j=1; j<=N; j++)
{
for(int dir=0; dir<4; dir++)
{
int xx=i+dx[dir];
int yy=j+dy[dir];
if(xx>=1&&xx<=N&&yy>=1&&yy<=N)
{
adj[cod[i][j]].push_back(cod[xx][yy]);
}
}
}
}
}
bool cmp(node a,node b)
{
return a.val>b.val;
}
bool cmp2(query a,query b)
{
return a.ans>b.ans;
}
void restore()
{
for(int i=1;i<=N;i++)
{
dad[i]=i;
sz[i]=1;
viz[i]=0;
}
}
int find_dad(int node)
{
while(dad[node]!=node) node=dad[node];
return node;
}
void Dsu(int rk,int rp)
{
if(sz[rk]>sz[rp]) swap(rk,rp);
sz[rp]+=rk;
dad[rk]=rp;
}
void uneste(int node)
{
viz[node]=1;
for(auto vec:adj[node])
{
if(viz[vec]==1)
{
int rk=find_dad(vec);
int rp=find_dad(node);
if(rk==rp) continue;
Dsu(rk,rp);
}
}
}
int main ()
{
f>>N>>Q;
for(int i=1; i<=N; i++)
{
for(int j=1; j<=N; j++)
{
int x;
f>>x;
cnt++;
cod[i][j]=cnt;
v[cnt].val=x;
v[cnt].cnt=cnt;
}
}
creategraph();
N=N*N;
sort(v+1,v+N+1,cmp);
for(int i=1;i<=Q;i++)
{
int x1,y1,x2,y2;
f>>x1>>y1>>x2>>y2;
q[i].x=cod[x1][y1];
q[i].y=cod[x2][y2];
q[i].ans=0;
q[i].idx=i;
// cout<<q[i].x<<" "<<q[i].y<<'\n';
}
for(long long pas=(1<<30);pas>=1;pas/=2)
{
restore();
int poz=1;
int idx1=0,idx2=0;
for(int i=1;i<=Q;i++)
{
while(poz<=N&&v[poz].val>=q[i].ans+pas)
{
uneste(v[poz].cnt);
poz++;
}
int dad1=find_dad(q[i].x);
int dad2=find_dad(q[i].y);
if(dad1==dad2)
{
q[i].ans+=pas;
aux1[++idx1]=q[i];
}
else
{
aux2[++idx2]=q[i];
}
}
merge(aux1+1,aux1+idx1+1,aux2+1,aux2+idx2+1,q+1,cmp2);
}
vector<int> sol(Q+5,0);
for(int i=1;i<=Q;i++)
{
sol[q[i].idx]=q[i].ans;
}
for(int i=1;i<=Q;i++)
{
g<<sol[i]<<'\n';
}
}