Cod sursa(job #1048565)

Utilizator ctlin04UAIC.VlasCatalin ctlin04 Data 6 decembrie 2013 01:12:44
Problema Matrice 2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.56 kb
#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 v; fin>>v;
         ++k; a[k].cel=k; a[k].val=v;
         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);
}