Cod sursa(job #2158068)

Utilizator valentinoltyanOltyan Valentin valentinoltyan Data 10 martie 2018 10:16:48
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream f ("arbint.in");
ofstream g ("arbint.out");

int n,m;
const int MAXN =100041;
int a[MAXN], arbint[4*MAXN];
void constructie(int st,int dr,int nod)
{
    if(st==dr)
        arbint[nod]=a[st];
    else
    {
        int m=(st+dr)/2;
        constructie(st,m,nod*2);
        constructie(m+1,dr,nod*2+1);
        arbint[nod]=max(arbint[nod*2],arbint[nod*2+1]);
    }
}
void update(int pos, int val, int st=1,int dr=n, int nod=1)
{
    if(st==dr)
    {
        arbint[nod]=val;
        return;
    }
    int m=(st+dr)/2;
    if(pos>m)
        update(pos,val,m+1,dr,nod*2+1);
    else
        if(pos<=m)
            update(pos,val,st,m,nod*2);
    arbint[nod]=max(arbint[nod*2],arbint[nod*2+1]);
}
int query(int qst, int qdr,int st=1,int dr=n,int nod=1)
{
    if(st>=qst&&dr<=qdr)
    {
        return arbint[nod];
    }
    int mij=(st+dr)/2;
    if(qdr<=mij)
        return query(qst,qdr,st,mij,nod*2);
    if(qst>mij)
        return query(qst,qdr,mij+1,dr,nod*2+1);
    return max(query(qst,qdr,st,mij,nod*2),query(qst,qdr,mij+1,dr,nod*2+1));
}
int main()
{
    f>>n>>m;
    for(int i=1;i<=n;i++)
        f>>a[i];
    constructie(1,n,1);
    for(int i=1;i<=m;i++)
    {
        int op,a,b;
        f>>op>>a>>b;
        if(op==0)
            g<<query(a,b)<<"\n";
        else
            update(a,b);
    }
    return 0;
}