Cod sursa(job #1153451)

Utilizator sorynsooSorin Soo sorynsoo Data 25 martie 2014 14:41:48
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
//ARBINT - > ARBORI DE INTERVALE
#include <stdio.h>
#include <fstream>
using namespace std;
#define dim 100001
int n,m,i,j,x,x0,tip,maxim;
int arb[4*dim+70];
void update(int nod, int poz, int st, int dr)
{
    if(st==dr)
    {
        arb[nod]=x;
        return ;
    }
    else
    {
        int mij=(st+dr)/2;
        if(poz<=mij)
            update(nod*2,poz,st,mij);
        else
            update(nod*2+1,poz,mij+1,dr);
    }
    arb[nod]=max(arb[nod*2],arb[nod*2+1]);
}
void interogare(int nod, int st, int dr, int start, int fin)
{
    if(start<=st && dr<=fin)
    {
        if(arb[nod]>maxim)
            maxim=arb[nod];
        return;
    }
    else
    {
        int mij=(st+dr)/2;
        if(start<=mij)
            interogare(nod*2,st,mij,start,fin);
        if(mij<fin)
            interogare(nod*2+1,mij+1,dr,start,fin);

    }
}
int main()
{
   freopen("arbint.in","r",stdin);
   freopen("arbint.out","w",stdout);
   scanf("%d%d",&n,&m);
   for(i=1; i<=n; i++)
   {
       scanf("%d",&x);
       update(1,i,1,n);
   }
   for(i=1; i<=m; i++)
   {
       scanf("%d%d%d",&tip,&x0,&x);
       if(tip==1)
            update(1,x0,1,n);
       else
       {
           maxim=-1;
           interogare(1,1,n,x0,x);
           printf("%d\n",maxim);
       }
   }
}