Cod sursa(job #1770736)

Utilizator MoleRatFuia Mihai MoleRat Data 4 octombrie 2016 19:38:28
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include <fstream>
#include <cmath>
using namespace std;
int A[270000],S[270000],n,m;
int t,a,b,rezi;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
void FORGE(int st,int dr,int pos)
{
    if (st==dr)
    {
        S[pos]=A[dr];
        return;
    }
    int mij=(dr+st)/2;
    FORGE(st,mij,2*pos);
    FORGE(mij+1,dr,2*pos+1);
    S[pos]=max(S[2*pos],S[2*pos+1]);
}
void MODIFY(int st,int dr,int p)
{
    if (st==dr)
        S[p]=A[st];
    else
    {
        int mij=(st+dr)/2;
        if (a<=mij)
            MODIFY(st,mij,2*p);
        else
            MODIFY(mij+1,dr,2*p+1);
        S[p]=max(S[2*p],S[2*p+1]);
    }
}
void SEEK(int st,int dr,int p)
{
    if (a<=st && dr<=b)
        rezi=max(rezi,S[p]);
    else
    {
        int mij=(st+dr)/2;
        if (a<=mij)
            SEEK(st,mij,2*p);
        if (mij+1<=b)
            SEEK(mij+1,dr,2*p+1);
    }
}
int main()
{
    fin>>n>>m;
    for (int i=1;i<=n;i++)
        fin>>A[i];
    FORGE(1,n,1);
    int len,z;
    if (log2(n)-(int)log2(n)==0)
        z=log2(n);
    else
        z=(int)log2(n)+1;
    len=2*pow(2,z)-1;
    for (int i=1;i<=m;i++)
    {
        fin>>t>>a>>b;
        if (t==0)
        {
            rezi=0;
            SEEK(1,n,1);
            fout<<rezi<<"\n";
        }
        else
        {
            A[a]=b;
            MODIFY(1,n,1);
        }
    }
    return 0;
}