Pagini recente » Cod sursa (job #1375403) | Cod sursa (job #516393) | Cod sursa (job #2940322) | Cod sursa (job #489357) | Cod sursa (job #1423788)
#include <cstdio>
#include <algorithm>
#include <cstring>
FILE* in=fopen("matrice2.in","r");
FILE* out=fopen("matrice2.out","w");
const int Q=307,W=20007;
int n,q;
int v[Q][Q],who[Q][Q];
struct tipe
{
int x,y;
int val;
bool operator <(const tipe &alt) const
{
return val>alt.val;
}
} t[Q*Q];
int up[Q*Q], s[Q*Q],lst=0;
void uita()
{
memset(up,0,sizeof up);
memset(s,0,sizeof s);
lst=1;
}
int uper(int x)
{
if(up[x]==0)
return x;
up[x]=uper(up[x]);
return up[x];
}
void unioni(int a, int b)
{
if(a==b)
return;
// a=uper(a);
// b=uper(b);
if(s[a]>s[b])
up[b]=a;
else if(s[a]<s[b])
up[a]=b;
else
{
s[a]++;
up[b]=a;
}
}
int dx[]={0,1,0,-1};
int dy[]={1,0,-1,0};
void uneste(int act)
{
for(lst; lst<=act; lst++)
{
s[who[t[lst].x][t[lst].y]]=1;
for(int k=0; k<4; k++)
{
if(who[t[lst].x+dx[k]][t[lst].y+dy[k]] < who[t[lst].x][t[lst].y] )
{
unioni(uper(who[t[lst].x+dx[k]][t[lst].y+dy[k]]),(uper(who[t[lst].x][t[lst].y])));
}
}
}
}
struct query{
int x,y,X,Y;
int cont;
int rez;
bool operator <(const query &alt) const
{
return rez<alt.rez;
}
} r[W];
bool cmp21(const query &a, const query &b)
{
return a.cont<b.cont;
}
void pre_proc()
{
std::sort(t+1,t+n*n+1);
for(int i=1; i<=n*n; i++)
{
who[t[i].x][t[i].y]=i;
}
int nxt=1;
for(int t=16; t>=0; t--)
{
int part=1<<t;
nxt=1;
for(int act=part; act<=n*n; act+=part)
{
uneste(act);
while(nxt<=q && r[nxt].rez<act)
{
if(uper(who[r[nxt].x][r[nxt].y])!=uper(who[r[nxt].X][r[nxt].Y]) )
{
r[nxt].rez=act;
}
nxt++;
}
}
std::sort(r+1,r+q+1);
uita();
}
std::sort(r+1,r+q+1,cmp21);
for(int i=1; i<=q; i++)
{
fprintf(out,"%d\n",t[r[i].rez+1].val);
}
}
void read()
{
fscanf(in,"%d%d",&n,&q);
for(int i=1; i<=n; i++)
{
for(int j=1; j<=n; j++)
{
fscanf(in,"%d",&v[i][j]);
t[(i-1)*n+j].x=i;
t[(i-1)*n+j].y=j;
t[(i-1)*n+j].val=v[i][j];
}
for(int i=1; i<=n; i++)
{
who[i][0]=Q*Q;
who[i][n+1]=Q*Q;
who[0][i]=Q*Q;
who[n+1][i]=Q*Q;
}
}
for(int i=1; i<=q; i++)
{
fscanf(in,"%d%d%d%d", &r[i].x, &r[i].y, &r[i].X, &r[i].Y);
r[i].cont=i;
}
}
int main()
{
read();
pre_proc();
return 0;
}