Cod sursa(job #828524)

Utilizator IoannaPandele Ioana Ioanna Data 3 decembrie 2012 21:07:11
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include<fstream>
#define NMAX (1<<18)
#define inf 1000000001

using namespace std;

int v[NMAX];

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

int n,m;

void scan()
{
    in>>n>>m;
}

void addToTree(int a,int st,int dr,int k,int p)
{
    if (st==dr)
    {
        v[k]=a;
        return;
    }
    int mij;
    mij=((st+dr)>>1);
    if (p<=mij)
    {
        addToTree(a,st,mij,(k<<1),p);
    }
    else addToTree(a,mij+1,dr,(k<<1)+1,p);
    if (v[(k<<1)]>v[(k<<1)+1])
        v[k]=v[k<<1];
    else v[k]=v[(k<<1)+1];
}

inline int max(int a,int b)
{
    if (a>b)
        return a;
    return b;
}

int searchMax(int k,int a,int b,int st,int dr)
{
    int fs=0,fd=0,mij;
    if (a<=st && dr<=b)
        return v[k];
    mij=((st+dr)>>1);
    if (a<=mij)
        fs=searchMax(k<<1,a,b,st,mij);
    if (b>mij)
        fd=searchMax((k<<1)+1,a,b,mij+1,dr);
    return max(fs,fd);
}
void solve()
{
    int a,b,c;
    for (int i=1;i<=m;i++)
    {
        in>>c>>a>>b;
        if (c==0)
        {
            out<<searchMax(1,a,b,1,n)<<"\n";
        }
        else addToTree(b,1,n,1,a);

    }
}

void add()
{
    int a;
    for (int i=1;i<=n;i++)
    {
        in>>a;
        addToTree(a,1,n,1,i);
    }
}

int main()
{
    scan();
    add();
    solve();
    return 0;
}