Cod sursa(job #212104)

Utilizator RobytzzaIonescu Robert Marius Robytzza Data 4 octombrie 2008 14:01:49
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
//arbori de intervale
#include <fstream>
#define MAXIMUN 100001
using namespace std;

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

long heap[MAXIMUN],n,m,val,d;
int stanga,dreapta,poz[MAXIMUN];
long maxx=-MAXIMUN;

int maxi(int a,int b)
{
    return a>b?a:b;
}

void creeare(int nod,int st,int dr)
{
    if (st>dr)
        return;
    if (st==dr)
    {
        heap[st]=val;
        return ;
    }
    int left=nod<<1;
    int right=(nod<<1)+1;
    int mij=(st+dr)>>1;
    if (d<=mij)
    creeare(left,st,mij);
    else
    creeare(right,mij+1,dr);
    heap[nod]=maxi(heap[left],heap[right]);
}

void maxim(int nod,int st,int dr)
{
    if (stanga<=st && dreapta>=dr)
    {
        if (maxx<heap[nod])
            maxx=heap[nod];
    return ;
    }
    int left=nod<<1;
    int right=(nod<<1)+1;
    int mij=(st+dr)>>1;
    if (stanga<=mij)
        maxim(left,st,mij);
    if (mij<dreapta)
        maxim(right,mij+1,dr);
}

void aflare()
{
    fin>>n>>m;
    for (int i=1;i<=n;i++)
    {
            fin>>val;
            d=i;
            creeare(1,1,n);
    }
    int ok;
    while(m)
    {
    fin>>ok>>stanga>>dreapta;
    if (ok==0)
    {
        maxx=-1;
        maxim(1,1,n);
        fout<<maxx<<"\n";
    }
    else
    {
        d=stanga;
        val=dreapta;
        creeare(1,1,n);
    }
    m--;
    }
}
int main ()
{
    aflare();
}