Pagini recente » Cod sursa (job #942068) | Cod sursa (job #606436) | Cod sursa (job #2182579) | Cod sursa (job #854559) | Cod sursa (job #1083805)
#include<stdio.h>
#include<vector>
#include<algorithm>
using namespace std;
struct question
{
int x0,y0,x1,y1,ind,ras;
};
struct punct
{
int x,y,ind;
};
int T[303*303],N,Q,mat[303][303];
vector<punct> puncte;
vector<question> questions;
int check[303][303];
int dx[]={-1,1,0,0};
int dy[]={0,0,-1,1};
bool cmp_puncte(punct p1,punct p2)
{
return mat[p1.x][p1.y]>mat[p2.x][p2.y];
}
bool cmp_q(question q1,question q2)
{
return q1.ras>q2.ras;
}
bool cmp_q2(question q1,question q2)
{
return q1.ind<q2.ind;
}
int father(int X)
{
if(T[X]==X)return X;
T[X]=father(T[X]);
return T[X];
}
void unite(int X,int Y)
{
for(int i=0;i<4;++i)
if(check[X+dx[i]][Y+dy[i]]>0)
T[father(check[X][Y])]=T[father(check[X+dx[i]][Y+dy[i]])];
}
int main()
{
freopen("matrice2.in","r",stdin);
freopen("matrice2.out","w",stdout);
scanf("%d%d",&N,&Q);
for(int i=1;i<=N;++i)
for(int j=1;j<=N;++j)
{
scanf("%d",&mat[i][j]);
punct p;p.x=i;p.y=j;p.ind=(i-1)*N+j;
puncte.push_back(p);
}
sort(puncte.begin(),puncte.end(),cmp_puncte);
for(int i=0;i<Q;++i)
{
question q;
scanf("%d%d%d%d",&q.x0,&q.y0,&q.x1,&q.y1);
q.ind=i;q.ras=0;
questions.push_back(q);
}
for(int k=19;k>=0;--k)
{
bool change=false;
sort(questions.begin(),questions.end(),cmp_q);
for(int i=1;i<=N;++i)
{
for(int j=1;j<=N;++j)check[i][j]=0;
}
for(int i=0;i<=N*N;++i)T[i]=i;
int used=0;
for(int j=0;j<Q;++j)
{
int m=questions[j].ras+(1<<k);
while(used<N*N&&mat[puncte[used].x][puncte[used].y]>=m)
{
check[puncte[used].x][puncte[used].y]=used+1;
unite(puncte[used].x,puncte[used].y);
++used;
}
int father1=father(check[questions[j].x0][questions[j].y0]);
int father2=father(check[questions[j].x1][questions[j].y1]);
if(father1>0&&(father1==father2)){questions[j].ras=m;change=true;}
}
// if(!change)break;
}
sort(questions.begin(),questions.end(),cmp_q2);
for(int i=0;i<Q;++i)printf("%d\n",questions[i].ras);
return 0;
}