Cod sursa(job #18345)

Utilizator snaked31Stanica Andrei snaked31 Data 18 februarie 2007 11:41:13
Problema Plantatie Scor 50
Compilator cpp Status done
Runda preONI 2007, Runda 2, Clasa a 10-a Marime 3.89 kb
#include <stdio.h>
#include <vector>

using namespace std;

#define INF 2000000000
#define nm 510

int v[nm][nm];
//int s[nm][nm][nm];
vector <int> s;

int n, m, i, j, x, y, l;
int tx[nm][nm*3], ty[nm][nm*3];

inline int MIN(int a, int b)

{
	return (a < b ? a : b);
}


inline int MAX(int a, int b)

{
	return (a > b ? a : b);
}


void read()

{
	scanf("%d %d", &n, &m);

    for (i=1; i<=n; i++)
    	for (j=1; j<=n; j++)
        {
        	scanf("%d ", &v[i][j]);
        }

}


void buildtx(int a, int b, int p, int l)

{
    if (a >= b)
    {
        tx[l][p] = v[l][a];
//        txmin[p] = v[l][a];
    }
    else
    {
        buildtx(a, (a+b)/2, 2*p, l);
        buildtx((a+b)/2+1, b, 2*p+1, l);

        tx[l][p] = MAX(tx[l][2*p], tx[l][2*p+1]);
//        tmin[p] = MIN(tmin[2*p], tmin[2*p+1]);
    }

}


void buildty(int a, int b, int p, int col)

{
    if (a >= b)
    {
        ty[col][p] = v[a][col];
//        txmin[p] = v[l][a];
    }
    else
    {
        buildty(a, (a+b)/2, 2*p, col);
        buildty((a+b)/2+1, b, 2*p+1, col);

        ty[col][p] = MAX(ty[col][2*p], ty[col][2*p+1]);
//        tmin[p] = MIN(tmin[2*p], tmin[2*p+1]);
    }

}


void researchx(int a, int b, int &x, int p, int A, int B, int l)

{
    if (a == A && b == B)
    {
//        x = MIN(x, tmin[p]);
        x = MAX(x, tx[l][p]);
    }
    else
    if (b <= (A+B) / 2)
    {
        researchx(a, b, x, 2*p, A, (A+B)/2, l);
    }
    else
    if (a > (A+B)/2)
    {
        researchx(a, b, x, 2*p+1, (A+B)/2+1, B, l);
    }
    else
    {
        researchx(a, (A+B)/2, x, 2*p, A, (A+B)/2, l);
        researchx((A+B)/2+1, b, x, 2*p+1, (A+B)/2+1, B, l);
    }
}


void researchy(int a, int b, int &x, int p, int A, int B, int l)

{
    if (a == A && b == B)
    {
//        x = MIN(x, tmin[p]);
        x = MAX(x, ty[l][p]);
    }
    else
    if (b <= (A+B) / 2)
    {
        researchy(a, b, x, 2*p, A, (A+B)/2, l);
    }
    else
    if (a > (A+B)/2)
    {
        researchy(a, b, x, 2*p+1, (A+B)/2+1, B, l);
    }
    else
    {
        researchy(a, (A+B)/2, x, 2*p, A, (A+B)/2, l);
        researchy((A+B)/2+1, b, x, 2*p+1, (A+B)/2+1, B, l);
    }
}


int mintx(int i, int i1, int j)

{
	int x = 0;

    researchx(i, i1, x, 1, 1, n, j);

    return x;
    
}


int minty(int i, int i1, int j)

{
	int x = 0;

    researchy(i, i1, x, 1, 1, n, j);

    return x;
    
}


void solve()

{

	for (i=1; i<=n; i++)
    {
    	buildtx(1, n, 1, i);
        buildty(1, n, 1, i);
    }

/*    for (i=1; i<=n; i++)
    	for (j=1; j<=n; j++)
        {
        	for (l=0; l<(MIN(n-i+1, n-j+1)); l++)
            {
                if (l == 0)
                {
                	s[i][j].push_back(v[i][j]);
                }
                else
                {
                	s[i][j].push_back( MAX(s[i][j][l-1], minty(i, i + l, j + l)) );
//                    s[i][j][l] = MAX(s[i][j][l-1], minty(i, i + l - 1, j + l - 1));
//                    s[i][j][l] = MAX(s[i][j][l], mintx(j, j + l - 1, i + l - 1));
                    s[i][j][l] = MAX(s[i][j][l], mintx(j, j + l, i + l));
                }
            }
        }*/
}


void write()

{
    for (i=1; i<=m; i++)
    {
    	scanf("%d %d %d", &x, &y, &l);
        s.clear();
        for (j=0; j<l; j++)
        {
        	if (j == 0)
            {
        		s.push_back(v[x][y]);
            }
            else
            {
                s.push_back(MAX(s[j-1], minty(x, x + j, y + j)));
                s[j] = MAX(s[j], mintx(y, y + j, x + j));
            }
        }
        printf("%d\n", s[l-1]);
    }
}


int main()

{
	freopen("plantatie.in", "r", stdin);
    freopen("plantatie.out","w",stdout);

    read();
    solve();
    write();

    fclose(stdin);
    fclose(stdout);

	return 0;
}