Cod sursa(job #897947)

Utilizator tanduraDomnita Dan tandura Data 27 februarie 2013 23:16:09
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <iostream>
#include <cstdio>
using namespace std;

int n,m,arbi[400070];

void adauga(int poz,int val,int nod,int st,int dr)
{
    if(st==dr)
        arbi[nod]=val;
    else
    {
        int piv=(st+dr)/2;
        if(poz<=piv)
            adauga(poz,val,2*nod,st,piv);
        else
            adauga(poz,val,2*nod+1,piv+1,dr);
        arbi[nod]=max(arbi[2*nod],arbi[2*nod+1]);
    }
}

void cautare(int nod,int st,int dr,int a,int b,int &maxim)
{
    if(a<=st && dr<=b)
      {
          if(maxim<arbi[nod])
             maxim=arbi[nod];
      }
    else
    {
        int piv=(st+dr)/2;
        if(a<=piv)
          cautare(2*nod,st,piv,a,b,maxim);
        if(piv<b)
          cautare(2*nod+1,piv+1,dr,a,b,maxim);
    }
}

void rezolvare()
{
    int i,v,t,a,b;
    freopen ("arbint.in","r",stdin);
    freopen ("arbint.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&v);
        adauga(i,v,1,1,n);
    }
    for(i=1;i<=m;i++)
    {
        scanf("%d%d%d",&t,&a,&b);
        if(t==0)
        {
            int maxim=-1;
            cautare(1,1,n,a,b,maxim);
            printf("%d\n",maxim);
        }
        else
          adauga(a,b,1,1,n);
    }
}

int main()
{
    rezolvare();
    return 0;
}