Cod sursa(job #1979873)

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

int n,m,v[100003],poz[100003];
struct arbore_interval
{
    int M;
}I[600003];

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].M = v[a];
        //I[nod].D = 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].M = max(I[left_son(nod)].M,I[right_son(nod)].M);
        //I[nod].D = I[left_son(nod)].D + I[right_son(nod)].D;
    }
}

arbore_interval Rezultat(int nod,int a,int b,int x,int y)
{
    arbore_interval s; //s.D=0; s.M=0;

    if( a == x && b == y )
    {
        s.M = I[nod].M;
        //s.D = I[nod].D;
        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 )
            {
                arbore_interval s1,s2;
                s1 = Rezultat(left_son(nod),a,mij,x,mij);
                s2 = Rezultat(right_son(nod),mij+1,b,mij+1,y);
                s.M = max(s1.M,s2.M);
                //s.D = s1.D + s2.D;
                return s;
            }
    }
    return s;
}

void Actualizare(int nod,int val,int y)
{
    I[nod].M = y;
    //I[nod].D = y;
    nod = father(nod);
    while( nod != 0 )
    {
        I[nod].M = max(I[left_son(nod)].M,I[right_son(nod)].M);
        //I[nod].D = I[nod].D - val + y;
        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
        {
            arbore_interval s;
            s = Rezultat(1,1,n,x,y);
            g<< s.M <<'\n';
        }
    }
    return 0;
}