Cod sursa(job #1844015)

Utilizator PaterucAPetruc Andrei Stefan PaterucA Data 9 ianuarie 2017 17:24:59
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.89 kb
#include <bits/stdc++.h>

using namespace std;

ifstream inf("arbint.in");
ofstream outf("arbint.out");

int n, m, z, aint[1<<18], i, a, b, c;

int querry(int, int, int );
int upd(int, int );

int main()
{
    inf>>n>>m;

    for(z=1; z<n; z*=2);

        z--;

    for(i=1; i<=n; i++)
        inf>>aint[z+i];
    for(i=z; i; i--)
        aint[i]=max(aint[2*i], aint[2*i+1]);
    for(; m; m--)
    {
        inf>>c>>a>>b;
        if(c==0)outf<<querry(1,1,z+1)<<'\n';else upd(a,b);
    }

    return 0;
}

int querry(int nod, int st, int dr)
{
    if(a<=st&&dr<=b)
        return aint[nod];
    if(a>dr||b<st)
        return 0;
    return max(querry(nod*2, st, (st+dr)/2), querry(nod*2+1, (st+dr)/2+1, dr));
}
int upd(int poz, int val)
{
    poz+=z;
    aint[poz]=val;
    for(poz/=2; poz; poz/=2)
        aint[poz]=max(aint[2*poz],aint[2*poz+1]);
    return 0;
}