Cod sursa(job #2717465)

Utilizator AACthAirinei Andrei Cristian AACth Data 7 martie 2021 14:39:42
Problema Plantatie Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <bits/stdc++.h>
using namespace std;
ifstream f("plantatie.in");
ofstream g("plantatie.out");
#define int long long
const int Max = 501;
void nos()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
}
int n,q;
int a[Max][Max];
void read()
{
    f>>n>>q;
    int i,j;
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
            f>>a[i][j];
}
int tree[Max][4*Max];
void create_tree(int tree[], int a[], int where, int left, int right)
{
    if(left == right)
    {
        tree[where] = a[left];
        return;
    }
    int mid = (left + right) / 2;
    create_tree(tree,a,2*where,left,mid);
    create_tree(tree,a,2*where+1,mid+1,right);
    tree[where] = max(tree[2*where],tree[2*where+1]);
}
int left_limit;
int right_limit;
int ans;
void query(int tree[], int where, int left, int right)
{
    if(left_limit <= left and right <= right_limit)
    {
        ans = max(ans,tree[where]);
        return;
    }
    int mid = (left + right) / 2;
    if(left_limit <= mid)query(tree,2*where,left,mid);
    if(mid + 1 <= right_limit)query(tree,2*where+1,mid+1,right);
}
void solve()
{
    int i;
    for(i=1;i<=n;i++)
        create_tree(tree[i],a[i],1,1,n);
    for(i=1;i<=q;i++)
    {
        int xs,ys,dim;
        f>>xs>>ys>>dim;
        ans = 0;
        left_limit = ys;
        right_limit = ys + dim - 1;
        int j;
        for(j = xs;j<=xs+dim-1;j++)
            query(tree[j],1,1,n);
        g<<ans<<'\n';
    }
}
void restart()
{

}

int32_t main()
{
    nos();

        read();
        solve();
        restart();

    return 0;
}