Pagini recente » Cod sursa (job #2928976) | Cod sursa (job #375717) | Cod sursa (job #2722576) | Cod sursa (job #2048727) | Cod sursa (job #2752369)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("plantatie.in");
ofstream fout("plantatie.out");
//RMQ 2D folosind tablou tridimensional
int n,m;
int val[18][1503][1503];
int maxval(int a,int b,int c,int d)
{
return max(max(a,b), max(c,d));
}
void Init()
{
for(int i=0; i<17; ++i)
for(int j=0; j<1500; ++j)
for(int k=0; k<1500; ++k)
val[i][j][k]=-1; //o valoare foarte mica nu va influenta maximul
}
void Prep()
{
//val[l][x][y]=maximul din patratul avand coltul stanga sus la coord (x,y) si latura 2^l
for(int l=1, range=2; range<=n; ++l, range*=2) //range=2^l
for(int x=0; x<n; ++x)
for(int y=0; y<n; ++y)
//sparg patratul mare in 4 patrate mici bazate pe calcule anterioare
val[l][x][y]=maxval(val[l-1][x][y], val[l-1][x+range/2][y], val[l-1][x][y+range/2], val[l-1][x+range/2][y+range/2]);
}
int maxQuery(int x, int y,int sz)
{
int powmax=1, indexpow=0;
//caut cea mai mare putere a lui 2 mai mica decat lungimea intervalului
while(powmax*2<=sz)
powmax*=2, indexpow++;
//sparg patratul mare in 4 patrate mai mici care au colturile in patratul mare
//matricile se pot intrepatrunde pentru ca fac maximul si nu influenteaza
return maxval(val[indexpow][x][y], val[indexpow][x][(y+sz)-powmax], val[indexpow][(x+sz)-powmax][y], val[indexpow][(x+sz)-powmax][(y+sz)-powmax]);
}
int main()
{
int left, right,sz;
fin>>n>>m;
Init();
for(int x=0; x<n; ++x)
for(int y=0; y<n; ++y)
fin>>val[0][x][y]; //prima linie e matricea
Prep(); //preprocesare
for(int i=1; i<=m; ++i)
{
fin>>left>>right>>sz; //capetele intervalului
fout<<maxQuery(left-1,right-1,sz)<<"\n"; //indexare de la 0 in tabloul meu
}
return 0;
}