Pagini recente » Cod sursa (job #2676353) | Cod sursa (job #849021) | Cod sursa (job #1798096) | Cod sursa (job #2221456) | Cod sursa (job #1048568)
#include<fstream>
#include<algorithm>
using namespace std;
typedef struct celula {
int p1,p2,nr;
celula *next;
} *query;
typedef struct { int cel,val; } tip;
tip a[100000];
query p,sf,v;
int tata[100000],i,n,q,x1,y1,x2,y2,j,k,sol[20005];
bool viz[305][305];
bool cmp(const tip &a, const tip &b) { return(a.val>b.val); }
int radacina(int x) {
int aux=x,r=x;
while (tata[r]!=r) r=tata[r];
while (tata[x]!=x) { aux=tata[x]; tata[x]=r; x=aux; }
return(r);
}
void update(int val){
while (p!=0&&(radacina(p->p1)==radacina(p->p2))) {
sol[p->nr]=val;
p=p->next;
}
query c=p;
while (c!=0&&c->next!=0) {
query h=c->next;
if (radacina(h->p1)==radacina(h->p2)) {
sol[h->nr]=val;
c->next=h->next;
}
c=c->next;
}
}
void add(int pos, int val) {
int xc,yc,posa,pos1=pos;
if (pos1%n==0) { yc=n; pos1-=n; } else yc=pos1%n;
xc=pos1/n+1;
viz[xc][yc]=1;
if (xc>1&&viz[xc-1][yc]) {
posa=pos-n;
int r1=radacina(pos),r2=radacina(posa);
if (r1!=r2) tata[r1]=r2;
}
if (xc<n&&viz[xc+1][yc]) {
posa=pos+n;
int r1=radacina(pos),r2=radacina(posa);
if (r1!=r2) tata[r1]=r2;
}
if (yc>1&&viz[xc][yc-1]) {
posa=pos-1;
int r1=radacina(pos),r2=radacina(posa);
if (r1!=r2) tata[r1]=r2;
}
if (yc<n&&viz[xc][yc+1]) {
posa=pos+1;
int r1=radacina(pos),r2=radacina(posa);
if (r1!=r2) tata[r1]=r2;
}
update(val);
}
int main(void) {
ifstream fin("matrice2.in");
ofstream fout("matrice2.out");
fin>>n>>q;
for (i=1; i<=n; ++i)
for (j=1; j<=n; ++j) {
int x; fin>>x;
++k; a[k].cel=k; a[k].val=x;
tata[k]=k;
}
for (i=1; i<=q; ++i) {
fin>>x1>>y1>>x2>>y2;
int p1=(x1-1)*n+y1, p2=(x2-1)*n+y2;
v=new celula; v->p1=p1; v->p2=p2; v->nr=i; v->next=0;
if (p==0) p=sf=v;
else {
sf->next=v; sf=v;
}
}
sort(a+1,a+k+1,cmp);
for (i=1; i<=k; ++i) add(a[i].cel,a[i].val);
for (i=1; i<=q; ++i) fout<<sol[i]<<"\n";
return(0);
}