Cod sursa(job #1053367)

Utilizator chiriacandrei25Chiriac Andrei chiriacandrei25 Data 12 decembrie 2013 18:23:23
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <fstream>
#include <algorithm>
#define nmax 400010

using namespace std;

int N,M,n,arb[nmax];

inline void Update(int p,int x)
{
    int k,y;
    arb[p]=x;
    while(p>1)
    {
        k=p/2;
        y=max(arb[2*k], arb[2*k+1]);
        if(y!=arb[k])
            arb[k]=y;
        else
            return ;
        p=k;
    }
}

inline int Query(int nod, int x,int y,int st,int dr)
{
    int m;
    if(x==st && y==dr)
        return arb[nod];
    m=(st+dr)/2;
    if(y<=m)
        return Query(nod*2,x,y,st,m);
    else
        if(x>m)
            return Query(nod*2+1,x,y,m+1,dr);
        else
            return max(Query(nod*2,x,m,st,m), Query(nod*2+1,m+1,y,m+1,dr));
}

int main()
{
    int i,tip,x,y;
    ifstream fin("arbint.in");
    ofstream fout("arbint.out");
    fin>>N>>M;
    for(n=1;n<N;n<<=1);

    for(i=n;i<n+N;++i)
        fin>>arb[i];
    for(i=n-1;i>0;--i)
        arb[i]=max(arb[i*2], arb[i*2+1]);
    while(M--)
    {
        fin>>tip>>x>>y;
        if(!tip)
            fout<<Query(1,x,y,1,n)<<"\n";
        else
            Update(n-1+x,y);
    }
    fin.close();
    fout.close();
    return 0;
}