Mai intai trebuie sa te autentifici.
Cod sursa(job #1723684)
Utilizator | Data | 1 iulie 2016 13:03:04 | |
---|---|---|---|
Problema | Plantatie | Scor | 100 |
Compilator | cpp | Status | done |
Runda | Arhiva de probleme | Marime | 1.18 kb |
#include <cstdio>
#define MAXN 500
#define MAXLOG 9
int rmq[MAXN+1][MAXN+1][MAXLOG+1],pow[MAXN+1];
inline int getmax(int a,int b){
if(a>b)
return a;
return b;
}
int main(){
FILE*fi,*fout;
int i,j,n,m,l,c,a,b,k,p2;
fi=fopen("plantatie.in" ,"r");
fout=fopen("plantatie.out" ,"w");
fscanf(fi,"%d %d " ,&n,&m);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
fscanf(fi,"%d" ,&rmq[i][j][0]);
pow[1]=0;
p2=1;
for(i=2;i<=n;i++){
if(i>=p2*2){
pow[i]=pow[i-1]+1;
p2*=2;
}
else
pow[i]=pow[i-1];
}
for(i=1;(1<<i)<=n+1;i++)
for(l=1;l+(1<<i)<=n+1;l++)
for(c=1;c+(1<<i)<=n+1;c++){
a=getmax(rmq[l][c][i-1],rmq[l][c+(1<<(i-1))][i-1]);
b=getmax(rmq[l+(1<<(i-1))][c][i-1],rmq[l+(1<<(i-1))][c+(1<<(i-1))][i-1]);
rmq[l][c][i]=getmax(a,b);
}
while(m>0){
m--;
fscanf(fi,"%d %d %d" ,&l,&c,&k);
a=getmax(rmq[l][c][pow[k]],rmq[l][c+k-(1<<pow[k])][pow[k]]);
b=getmax(rmq[l+k-(1<<pow[k])][c][pow[k]],rmq[l+k-(1<<pow[k])][c+k-(1<<pow[k])][pow[k]]);
fprintf(fout,"%d\n" ,getmax(a,b));
}
fclose(fi);
fclose(fout);
return 0;
}