Cod sursa(job #1749242)

Utilizator delia_ioanaCeapa Delia Ioana delia_ioana Data 28 august 2016 09:59:39
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <fstream>
using namespace std;
#define sizez 100004
ifstream in("arbint.in");
ofstream out("arbint.out");
int A[4*sizez+30],a,b,m,n,tip;
int QueryAI(int,int,int,int,int);
void UpdateAI(int,int,int,int,int,int);
void ArboriDeIntervale()
{
 
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    scanf("%d%d",&n,&m);
    int val;
    for(int i = 1 ; i<= n ; i++)
    {
        scanf("%d",&val);
        UpdateAI(1,1,n,i,i,val);
    }
    while(m--)
    {
        scanf("%d%d%d",&tip,&a,&b);
        if(tip)
            UpdateAI(1,1,n,a,a,b);
        else
            printf("%d\n",QueryAI(1,1,n,a,b));
    }
}
void UpdateAI(int nod, int st, int dr,int a, int b,int val)
{
    if ( a<= st &&  dr <= b)
        A[nod] = val;
    else
    {
        int mij =  (st + dr) / 2;
        if( a <= mij)
            UpdateAI( 2* nod , st, mij,a,b,val);
        if( b> mij)
            UpdateAI( 2* nod +1, mij+1, dr ,a,b,val);
        A[nod] = max(A[2*nod],A[2*nod+1]);
    }
}
int QueryAI(int nod, int st, int dr,int a, int b)
{
    if (a <= st && dr <= b)
        return A[nod];
    else
    {
        int div = (st+dr)/2,maxa = 0, maxb= 0;
        if ( a <= div )
            maxa = QueryAI(2*nod,st,div,a,b);
        if ( div < b )
            maxb = QueryAI(2*nod+1,div+1,dr,a,b);
        return max(maxa,maxb);
    }
 
}
int main()
{
    ArboriDeIntervale();
    return 0;
}