Cod sursa(job #3003382)

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

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

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

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

  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)
 {p=nod, p1=st;
  B(1, 1, n);
 }
 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)
{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);
  if(mij<qs)return Q(nod*2+1, mij+1, dr, qs, qd);

  int a1=Q(nod*2, st, mij, qs, qd), b1=Q(nod*2+1, mij+1, dr, qs, qd);
  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)
 {p=nod;
  return Q(1, 1, n, b, d);
 }
 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;
}