Cod sursa(job #1777125)

Utilizator matei140401Iorgulescu Matei matei140401 Data 12 octombrie 2016 08:25:45
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda cerculdeinfo-lectia2-arborideintervale Marime 1.51 kb
#include <cstdio>
#include <fstream>

using namespace std;
int maxim=0;
int v[100001],aint[200001];
int max(int a,int b)
{
    if(a>b)
        return a;
    else
        return b;
}
void update(int nod,int st,int dr,int poz,int x)
{
    if(st==dr)
    {
        aint[nod]=x;
        v[poz]=x;
        return;
    }
    int mij=(st+dr)/2;
    if(poz<=mij)
        update(nod*2,st,mij,poz,x);
    else
        update(nod*2+1,mij+1,dr,poz,x);
    aint[nod]=max(aint[nod*2],aint[nod*2+1]);
}
void query(int nod,int st,int dr,int A,int B)
{
    if(A<=st&&dr<=B)
    {
        maxim=max(maxim,aint[nod]);
              return ;
    }
    int mij=(st+dr)/2;
    if(mij>=A)
        query(nod*2,st,mij,A,B);
    if(mij+1<=B)
        query(nod*2+1,mij+1,dr,A,B);
}
void Build(int nod,int st,int dr)
{
    if(st==dr)
    {
        aint[nod]=v[st];
        return;
    }
    int mij=(st+dr)/2;
    Build(nod*2,st,mij);
    Build(nod*2+1,mij+1,dr);
    aint[nod]=max(aint[2*nod],aint[2*nod+1]);
}
int main()
{
    ifstream fin("arbint.in");
    ofstream fout("arbint.out");
    int n,m,i,ok,a,b;

    fin>>n>>m;
    for(i=1; i<=n; i++)
        fin>>v[i];
    Build(1,1,n);
    for(i=1; i<=m; i++)
    {
        fin>>ok>>a>>b;
        //fout<<ok<<" "<<a<<" "<<b<<"\n";
        if(ok)
        {
            update(1,1,n,a,b);
        }
        else
        {

            maxim=-1;
            query(1,1,n,a,b);
            fout<<maxim<<"\n";
        }
    }



    return 0;
}