Cod sursa(job #2609223)

Utilizator radubigColtos Radu radubig Data 2 mai 2020 12:37:45
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.41 kb
#include <fstream>
#define lim 100000

using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");

int v[lim+5];
int aint[4*lim+5];
int n,m;

void build(int nod, int st, int dr)
{
    if(st>dr) return;
    if(st==dr)
        aint[nod] = v[st];
    else
    {
        int mij = (st+dr)/2;
        build(2*nod, st, mij);
        build(2*nod+1, mij+1, dr);
        aint[nod] = max(aint[2*nod], aint[2*nod+1]);
    }
}

void update(int nod, int st, int dr, int poz, int val)
{
    if(st>dr || poz<st || poz>dr) return;
    if(st==dr)
        aint[nod]=val;
    else
    {
        int mij = (st+dr)/2;
        update(2*nod, st, mij, poz, val);
        update(2*nod+1, mij+1, dr, poz, val);
        aint[nod]=max(aint[2*nod], aint[2*nod+1]);
    }
}

int query(int nod, int st, int dr, int ql, int qr)
{
    if(st>dr || qr<st || ql>dr) return -1;
    if(ql <= st && qr >= dr)
        return aint[nod];
    else
    {
        int mij = (st+dr)/2;
        int ansleft = query(2*nod, st, mij, ql, qr);
        int ansright = query(2*nod+1, mij+1, dr, ql, qr);
        return max(ansleft, ansright);
    }
}

int main()
{
    int t,a,b;
    in>>n>>m;
    for(int i=1; i<=n; i++) in>>v[i];

    build(1,1,n);

    for(int i=1; i<=m; i++)
    {
        in>>t>>a>>b;
        if(t==0) out<<query(1,1,n,a,b)<<'\n';
        else update(1,1,n,a,b);
    }
    return 0;
}