Cod sursa(job #1498899)

Utilizator metrix007Lungu Ioan Adrian metrix007 Data 9 octombrie 2015 21:01:47
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <iostream>
#include <algorithm>
#include <fstream>
#define NMAX  4*100000+66
using namespace std;

int arbore[NMAX],val,a,b,t,poz,Max,n,m;
void Update(int,int,int);
void Query(int,int,int);
int Maxim(int a,int b)
{
    if(a>b) return a;
    else return b;
}
int main()
{
    ifstream in("arbint.in");
    ofstream out("arbint.out");

    in  >> n >> m;

    for(int i=0;i<n;i++)
    {
        in >> val;
        poz = i+1;
        Update(1,1,n);
    }
    //for(int i=1;i<=9;i++)
      //  cout << arbore[i] << " ";
    for(int i=0;i<m;i++)
    {
        in >> t >> a >> b;
        if(t==0)
        {
            Max = -1;
            Query(1,1,n);
            out << Max << "\n";
        }
        else
        {
            poz = a;
            val = b;
            Update(1,1,n);
        }
    }

    return 0;
}


void Update(int nod, int stanga,int dreapta)
{

    if(stanga==dreapta)
    {
        arbore[nod] = val;
       // cout << nod << " ";
        return;
    }

    int mijloc = (stanga+dreapta)/2;
    if(mijloc>=poz) Update(2*nod,stanga,mijloc);
    else if(mijloc<poz) Update(2*nod+1,mijloc+1,dreapta);

    arbore[nod] = Maxim(arbore[2*nod],arbore[2*nod+1]);
}

void Query(int nod,int stanga, int dreapta)
{
    if(a <=stanga && dreapta<=b)
    {
        Max = Maxim(arbore[nod],Max);
        return;
    }

    int mijloc = (stanga+dreapta)/2;

    if(a<=mijloc) Query(2*nod,stanga,mijloc);
    if(mijloc<b) Query(2*nod+1,mijloc+1,dreapta);
}