Cod sursa(job #18233)

Utilizator devilkindSavin Tiberiu devilkind Data 18 februarie 2007 10:54:59
Problema Plantatie Scor 0
Compilator cpp Status done
Runda preONI 2007, Runda 2, Clasa a 10-a Marime 3.09 kb
#include <stdio.h>
#define NMAX 514

FILE *f = fopen("plantatie.in","rt"), *g = fopen("plantatie.out","wt");

long int a[NMAX][NMAX],i,j,k,n,x1,y1,x2,y2,l,m,sol;

struct nod{long int max,x1,y1,x2,y2;} arb[NMAX*NMAX*10];

void citire()
{
fscanf(f,"%ld %ld",&n,&m);

for (i=1;i<=n;i++)
    for (j=1;j<=n;j++)
    fscanf(f,"%ld",&a[i][j]);

k=1;
while (k<n) k*=2;

for (i=n+1;i<=k;i++)
    for (j=n+1;j<=k;j++)
        a[i][j]=0;
}

long int MAXX(long int a, long int b)
{
if (a<b) return b;
return a;
}

void build(long int nod, long int x1, long int y1, long int x2,long int y2)
{
long int midx,midy;
if ((x1==x2)&&(y1==y2)) {
                        arb[nod].max=a[x1][y1];
                        arb[nod].x1=x1;
                        arb[nod].x2=x2;
                        arb[nod].y1=y1;
                        arb[nod].y2=y2;
                        }
               else 
                        {
                        midx=(x1+x2)/2;
                        midy=(y1+y2)/2;

                        build(nod*4,x1,y1,midx,midy);
                        build(nod*4+1,midx+1,y1,x2,midy);
                        build(nod*4+2,x1,midy+1,midx,y2);
                        build(nod*4+3,midx+1,midy+1,x2,y2);
                        
                        arb[nod].x1=x1;
                        arb[nod].x2=x2;
                        arb[nod].y1=y1;
                        arb[nod].y2=y2;
                        
                        arb[nod].max=-1;
                        
                        arb[nod].max=MAXX(arb[nod].max,arb[nod*4].max);
                        arb[nod].max=MAXX(arb[nod].max,arb[nod*4+1].max);
                        arb[nod].max=MAXX(arb[nod].max,arb[nod*4+2].max);
                        arb[nod].max=MAXX(arb[nod].max,arb[nod*4+3].max);
                        }
}

int incl(long int nod, long int a, long int b, long int c, long int d)
{
long int x1,x2,y1,y2,ok1=0,ok2=0;
x1=arb[nod].x1;
x2=arb[nod].x2;
y2=arb[nod].y2;
y1=arb[nod].y1;
if (((a<=x1)&&(x1<=c))&&((b<=y1)&&(y1<=d))) ok1=1;

if (((a<=x2)&&(x2<=c))&&((b<=y2)&&(y2<=d))) ok2=1;

if (ok1&&ok2) return 1;
return 0;
}


int inter(long int nod, long int a, long int b, long int c, long int d)
{
long int x1,x2,y1,y2,ok1=0,ok2=0;
x1=arb[nod].x1;
x2=arb[nod].x2;
y2=arb[nod].y2;
y1=arb[nod].y1;

if (((x1<=a)&&(a<=x2))&&((y1<=b)&&(b<=y2))) ok1=1;

if (((x1<=c)&&(c<=x2))&&((y1<=d)&&(d<=y2))) ok1=1;
if (ok1||ok2) return 1;
return 0;
}

void query(long int nod, long int a, long int b, long int c, long int d)
{     
if (incl(nod,a,b,c,d)) sol=MAXX(sol,arb[nod].max);
   else 
        if (inter(nod,a,b,c,d)) 
           {
           query(nod*4,a,b,c,d);
           query(nod*4+1,a,b,c,d);
           query(nod*4+2,a,b,c,d);
           query(nod*4+3,a,b,c,d);
           }     
}



int main()
{
citire();
build(1,1,1,k,k);

for (i=1;i<=m;i++)
    {
    fscanf(f,"%ld %ld %ld",&x1,&y1,&l);
    x2=x1+l-1;
    y2=y1+l-1;
    sol=0;
    query(1,x1,y1,x2,y2);
    fprintf(g,"%ld\n",sol);
    }
fclose(f);
fclose(g);
return 0;
}