Cod sursa(job #212098)

Utilizator RobytzzaIonescu Robert Marius Robytzza Data 4 octombrie 2008 13:50:35
Problema Arbori de intervale Scor 20
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,sir[MAXIMUN];
int stanga,dreapta,poz[MAXIMUN];
long maxx=-MAXIMUN;

void citire()
{
    fin>>n>>m;
    for (int i=1;i<=n;i++)
        fin>>sir[i];
}

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[nod]=sir[st];
        poz[st]=nod;
        return ;
    }
    int left=nod<<1;
    int right=(nod<<1)+1;
    int mij=(st+dr)>>1;
    creeare(left,st,mij);
    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()
{
    creeare(1,1,n);
    int ok,a,b;
    while(m)
    {
    fin>>ok>>stanga>>dreapta;
    if (ok==0)
    {
        maxx=-1;
        maxim(1,1,n);
        fout<<maxx<<"\n";
    }
    else
    {
        sir[stanga]=dreapta;
        creeare(1,1,n);
    }
    m--;
    }
}
int main ()
{
    citire();
    aflare();
}