Cod sursa(job #1204195)

Utilizator pentrusandaPentru Sanda pentrusanda Data 2 iulie 2014 12:20:10
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <fstream>

using namespace std;

int n,m,adi[280005],x,tip,y;

void init (int st,int dr,int i,int v,int nod)
{
    if (st==dr)
    {
        adi[nod]=v;
    }else
    {
        int m=(st+dr)/2;
        if (i<=m) init(st,m,i,v,nod*2);else init(m+1,dr,i,v,nod*2+1);
        adi[nod]=adi[nod*2]; if (adi[nod*2+1]>adi[nod]) adi[nod]=adi[nod*2+1];
    }
}

int scoate(int st,int dr,int i,int j,int nod)
{
    if (st==i && dr==j)
    {
        return adi[nod];
    }else
    {
        int m=(st+dr)/2;
        if (j<=m)
        {
            return scoate(st,m,i,j,nod*2);
        }else
        if (i>m)
        {
            return scoate(m+1,dr,i,j,nod*2+1);
        }else
        {
            int v1=scoate(st,m,i,m,nod*2),v2=scoate(m+1,dr,m+1,j,nod*2+1);
            if (v1>v2) return v1;else return v2;
        }
    }
}

int main()
{
    ifstream in ("arbint.in");
    ofstream out ("arbint.out");

    in>>n>>m;
    for (int i=1;i<=n;++i)
    {
        in>>x;
        init(1,n,i,x,1);
    }

    for (int i=1;i<=m;++i)
    {
        in>>tip>>x>>y;
        if (tip==0)
        {
            out<<scoate(1,n,x,y,1)<<"\n";
        }else
        {
            init(1,n,x,y,1);
        }
    }

    in.close();
    out.close();
    return 0;
}