Cod sursa(job #2396049)

Utilizator mihailrazMihail Turcan mihailraz Data 3 aprilie 2019 10:30:45
Problema Arbori de intervale Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.16 kb
#include <fstream>

using namespace std;
ifstream fi("arbint.in");
ofstream fo("arbint.out");
const int nmax=1e5, inf=2e9;
int n, m;
int X[nmax+5];
int SGT[4*nmax+5];

void update(int nod, int st, int dr, int pos, int val)
{
    if(st==dr)
    {
        SGT[nod]=val;
        return;
    }
    int mid=st+(dr-st)/2;
    if(pos<=mid)
    {
        update(2*nod, st, mid, pos, val);
    }
    else
    {
        update(1+2*nod, mid+1, dr, pos, val);
    }
}

int max_query(int nod, int st, int dr, int a, int b)
{
    if(st>b || dr<a)
    {
        return -inf;
    }
    if(st==dr)
    {
        return SGT[nod];
    }
    int mid=st+(dr-st)/2;
    return max(max_query(2*nod, st, mid, a, b), max_query(1+2*nod, mid+1, dr, a, b));
}

int main()
{
    fi>>n>>m;
    for(int i=1; i<=n; i++)
    {
        fi>>X[i];
        update(1, 1, n, i, X[i]);
    }

    while(m--)
    {
        int q, a, b;
        fi>>q>>a>>b;
        if(q==0)
        {
            fo<<max_query(1, 1, n, a, b)<<"\n";
        }
        else
        {
            update(1, 1, n, a, b);
        }
    }
    fi.close();
    fo.close();
    return 0;
}