Cod sursa(job #1978903)

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

int N,M,v[100001];

struct nod
{
    int Max,a,b;
    nod *st,*dr,*f;
}*rad;

void Creare(nod *& r,nod *fa,int a, int b)
{
    if( a == b )
    {
        r = new nod;
        r->a = a;
        r->b = a;
        r->st = NULL;
        r->dr = NULL;
        r->f = fa;

        r->Max = v[a];
    }
    else
    {
        r = new nod;
        r->a = a;
        r->b = b;
        r->st = NULL;
        r->dr = NULL;
        r->f = fa;

        Creare(r->st,r,a,(a+b)/2);
        Creare(r->dr,r,(a+b)/2+1,b);

        r->Max = max(r->st->Max,r->dr->Max);
    }
}

void Actualizare(int x,int y)
{
    nod* cap = rad;
    int mij,a = 1,b = N;

    while( a != b && a != x )
    {
        mij = (a+b)/2;

        if( x <= mij )
        {
            b = mij;
            cap = cap->st;
        }
        else
        {
            a = mij+1;
            cap = cap->dr;
        }
    }

    cap->Max = y;
    cap = cap->f;

    while( cap != NULL )
    {
        cap->Max = max(cap->st->Max,cap->dr->Max);
        cap = cap->f;
    }
}

int Raspuns(nod *r,int a,int b,int x,int y)
{
    int mij = (a+b)/2;
    if( x == a && y == b )
        return r->Max;
    else
    {
        if( x <= mij && mij < y )
            return max(Raspuns(r->st,a,mij,x,mij),Raspuns(r->dr,mij+1,b,mij+1,y));
        else
        if( x <= mij && y <= mij )
            return Raspuns(r->st,a,mij,x,y);
        else
        if( x > mij && y > mij )
            return Raspuns(r->dr,mij+1,b,x,y);
    }
    return -1;
}

int main()
{
    int p,x,y;

    f>>N>>M;
    for(int i = 1 ; i <= N ; i++)
        f>>v[i];

    Creare(rad,rad,1,N);
    rad->f = NULL;

    for(int i = 1 ; i <= M ; i++)
    {
        f>>p>>x>>y;

        if( p == 1 )
        {
            Actualizare(x,y);
            v[x] = y;
        }
        else
            g<<Raspuns(rad,1,N,x,y)<<'\n';
    }

    return 0;
}