Cod sursa(job #3003378)

Utilizator Luca529Taschina Luca Luca529 Data 15 martie 2023 18:10:48
Problema Plantatie Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.64 kb
#include <iostream>
#include <fstream>

using namespace std;
ifstream fin("plantatie.in");
ofstream fout("plantatie.out");
int n, x[2001][2001], y[501][501];

void B(int nod, int st, int dr, int p, int p1)
{if(st==dr)
 x[p][nod]=y[p1][st];
 else
 {int mij=(st+dr)/2;

  B(nod*2, st, mij, p, p1);
  B(nod*2+1, mij+1, dr, p, p1);

  x[p][nod]=max(x[p][nod*2], x[p][nod*2+1]);
 }
}

void C(int nod)
{for(int i=1;i<=n*4;i++)
 x[nod][i]=max(x[nod*2][i], x[nod*2+1][i]);
}

void Build(int nod, int st, int dr)
{if(st==dr)
 B(1, 1, n, nod, st);
 else
 {int mij=(st+dr)/2;

  Build(nod*2, st, mij);
  Build(nod*2+1, mij+1, dr);

  C(nod);
 }
}

int Q(int nod, int st, int dr, int qs, int qd, int p)
{if(st>=qs && dr<=qd)
 return x[p][nod];
 else
 {int mij=(st+dr)/2;

  if(mij>=qd)return Q(nod*2, st, mij, qs, qd, p);
  if(mij<qs)return Q(nod*2+1, mij+1, dr, qs, qd, p);

  int a1=Q(nod*2, st, mij, qs, qd, p), b1=Q(nod*2+1, mij+1, dr, qs, qd, p);
  return max(a1, b1);
 }
}

int Query(int nod, int st, int dr, int a, int b, int c, int d)
{if(st>=a && c>=dr)
 return Q(1, 1, n, b, d, nod);
 else
 {int mij=(st+dr)/2;

  if(mij>=c)return Query(nod*2, st, mij, a, b, c, d);
  if(mij<a)return Query(nod*2+1, mij+1, dr, a, b, c, d);

  int a1=Query(nod*2, st, mij, a, b, c, d), b1=Query(nod*2+1, mij+1, dr, a, b, c, d);
  return max(a1, b1);
 }
}

int main()
{   int m, a, b, c;
    fin>>n>>m;
    for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)
    fin>>y[i][j];

    Build(1, 1, n);

    for(int i=1;i<=m;i++)
    {fin>>a>>b>>c;

     fout<<Query(1, 1, n, a, b, a+c-1, b+c-1)<<"\n";
    }

    return 0;
}