Cod sursa(job #2285648)

Utilizator suceavaSMSuceava Edy suceavaSM Data 18 noiembrie 2018 20:51:25
Problema Matrice 2 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.29 kb
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};
struct pct{
int x,y;
}v[90005];
int a[305][305],sol[20005],tata[90005],b[305][305];
struct segm{
int x1,x2,y1,y2,p;
}s[20005];
int cmp(pct p1,pct p2){
return a[p1.x][p1.y]>a[p2.x][p2.y];}
int cmp2(segm s1,segm s2){
return sol[s1.p]>sol[s2.p];}
int onion(int x,int y){
tata[x]=y;}
int findt(int x){
if (x==tata[x])
return x;
return tata[x]=findt(tata[x]);}
int main(){
freopen("matrice2.in","r",stdin);
freopen("matrice2.out","w",stdout);
int n,q,i,j,nr=0,k,m,d,t1,t2;
scanf("%d%d",&n,&q);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
scanf("%d",&a[i][j]),v[++nr].x=i,v[nr].y=j;
sort(v+1,v+nr+1,cmp);
for(i=1;i<=q;i++)
scanf("%d%d%d%d",&s[i].x1,&s[i].y1,&s[i].x2,&s[i].y2),s[i].p=i;
for(k=(1<<20);k;k>>=1){
sort(s+1,s+q+1,cmp2);
memset(b,0,sizeof(b));
for(i=1;i<=n*n;++i)
tata[i]=i;
for(i=j=1,m=0;j<=q;++j){
while(i<=n*n && sol[s[j].p]+k<=a[v[i].x][v[i].y]){
b[v[i].x][v[i].y]=++m;
for(d=0;d<=3;++d)
if (b[v[i].x+dx[d]][v[i].y+dy[d]])
onion(findt(b[v[i].x][v[i].y]),findt(b[v[i].x+dx[d]][v[i].y+dy[d]]));++i;}
t1=findt(b[s[j].x1][s[j].y1]);
t2=findt(b[s[j].x2][s[j].y2]);
if (t1 && t1==t2)
sol[s[j].p]+=k;}}
for(i=1;i<=q;++i)
printf("%d\n",sol[i]);
return 0;}