Cod sursa(job #1180498)

Utilizator ArchazeyBaltatu Andrei-Mircea Archazey Data 30 aprilie 2014 18:29:22
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
#include<fstream>
#include<cmath>
#include<algorithm>
#include<bitset>
using namespace std;

ifstream fin("arbint.in");
ofstream fout("arbint.out");

int n,m,a[100005],aint[270000];

inline void Citire()
{
    int i;
    fin>>n>>m;
    for (i=1;i<=n;i++)
        fin>>a[i];
}

inline int Calc(int st,int dr,int poz)
{
    if (st==dr)
        {
            aint[poz]=a[st];
            return a[st];
        }
    else
        {
            int mij;
            mij=(st+dr)/2;
            aint[poz]=max(Calc(st,mij,2*poz),Calc(mij+1,dr,2*poz+1));
            return aint[poz];
        }

}

inline int Query(int nod,int st,int dr,int a,int b)
{
    if (st>=a && dr<=b)
        return aint[nod];
    else
        {
            int mij,rez=-1;
            mij=(st+dr)/2;
            if (a<=mij) rez=max(rez,Query(2*nod,st,mij,a,b));
            if (b>mij)  rez=max(rez,Query(2*nod+1,mij+1,dr,a,b));
            return rez;
        }
}

inline void Update(int nod,int st,int dr,int a,int b)
{
    if (st==dr)
        aint[nod]=b;
    else
        {
            int mij;
            mij=(st+dr)/2;
            if (a<=mij) Update(2*nod,st,mij,a,b);
            if (a>mij)  Update(2*nod+1,mij+1,dr,a,b);
            aint[nod]=max(aint[2*nod],aint[2*nod+1]);
        }
}

inline void Rezolva()
{
    int i,op,x,y;
    for (i=1;i<=m;i++)
        {
            fin>>op>>x>>y;
            if (!op)
                fout<<Query(1,1,n,x,y)<<"\n";
            else
                Update(1,1,n,x,y);
        }

}

int main()
{
    Citire();
    Calc(1,n,1);
    Rezolva();
    return 0;
}