Cod sursa(job #1979897)

Utilizator horiacoolNedelcu Horia Alexandru horiacool Data 11 mai 2017 17:23:28
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 2 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");

int n,m,v[100053],poz[100053];
int I[200053];

inline int father(int nod)
{
    return nod/2;
}
inline int left_son(int nod)
{
    return nod*2;
}
inline int right_son(int nod)
{
    return nod*2+1;
}

void Creare(int nod,int a,int b)
{
    if( a == b )
    {
        I[nod] = v[a];
        poz[a] = nod;
    }
    else
    {
        int mij = (a+b)/2;
        Creare(left_son(nod),a,mij);
        Creare(right_son(nod),mij+1,b);

        I[nod] = max(I[left_son(nod)],I[right_son(nod)]);
    }
}

int Rezultat(int nod,int a,int b,int x,int y)
{
    int s=0;

    if( a == x && b == y )
    {
        s = I[nod];
        return s;
    }
    else
    {
        int mij = (a+b)/2;
        if( x <= mij && y <= mij  )
            return Rezultat(left_son(nod),a,mij,x,y);
        else
            if( x > mij && y > mij  )
                return Rezultat(right_son(nod),mij+1,b,x,y);
            else
                if( x <= mij && y > mij )
            {
                int s1,s2;
                s1 = Rezultat(left_son(nod),a,mij,x,mij);
                s2 = Rezultat(right_son(nod),mij+1,b,mij+1,y);
                s = max(s1,s2);
                return s;
            }
    }
    return s;
}

void Actualizare(int nod,int val,int y)
{
    I[nod] = y;

    nod = father(nod);
    while( nod != 0 )
    {
        I[nod] = max(I[left_son(nod)],I[right_son(nod)]);
        nod = father(nod);
    }
}

int main()
{
    int tip,x,y;
    f>>n;
    f>>m;
    for(int i = 1 ; i <= n ; i++)
        f>>v[i];
    Creare(1,1,n);
    for(int i = 1 ; i <= m ; i++)
    {
        f>>tip>>x>>y;
        if( tip == 1 )
        {
            Actualizare(poz[x],v[x],y);
            v[x] = y;
        }
        else
        {
            int s;
            s = Rezultat(1,1,n,x,y);
            g<< s <<'\n';
        }
    }
    return 0;
}