Cod sursa(job #1046386)

Utilizator leontinLeontin leontin Data 2 decembrie 2013 21:25:45
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include<fstream>
#define N 100004
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");

int n,m,poz,st,f;
long long x,arb[5*N],v,mx;

void update(int nod,int l,int r)
{
    int m;
    if(l == r)
    {
        arb[nod]=v;
        return;
    }
    m=(l+r)/2;
    if(poz <= m)update(2*nod,l,m);
    else update(2*nod+1,m+1,r);
    arb[nod]=max(arb[2*nod],arb[2*nod+1]);
}

void query(int nod,int l,int r)
{
    int m;
    if(st<=l && r<=f)
    {
        if(mx < arb[nod] )
            mx=arb[nod];
        return;
    }
    m=(l+r)/2;
    if(st <= m)query(2*nod,l,m);
    if(m < f) query(2*nod+1,m+1,r);
}

int main()
{
    long long i,op,a,b;
    in>>n>>m;
    for(i=1; i<=n; i++)
    {
        in>>x;
        poz=i;
        v=x;
        update(1,1,n);
    }
    for(i=1; i<=m; i++)
    {
        in>>op>>a>>b;
        if(op==1)
        {
            poz=a;
            v=b;
            update(1,1,n);
        }
        else
        {
            mx=-1;
            st=a;
            f=b;
            query(1,1,n);
            out<<mx<<'\n';
        }
    }
    in.close();
    out.close();
    return 0;
}