Cod sursa(job #1092163)

Utilizator Dddarius95Darius-Florentin Neatu Dddarius95 Data 26 ianuarie 2014 17:20:09
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <fstream>
#include <algorithm>
#define Nmax 100099
#define T(i) i/2
#define LS(i) (2*i)
#define RS(i) (2*i+1)
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");

int N,M,v[Nmax],Arb[4*Nmax],poz,val,a,b,sol;

void Update(int nod,int left,int right)
{
    if(left==right)
    {
        Arb[nod]=val;
        return;
    }
    int middle=(left+right)>>1;
    if(poz<=middle)Update(LS(nod),left,middle);
           else    Update(RS(nod),middle+1,right);
    if(Arb[LS(nod)]>Arb[RS(nod)])Arb[nod]=Arb[LS(nod)];
        else Arb[nod]=Arb[RS(nod)];
}

void Querry(int nod,int left,int right)
{
    if(a<=left && right<=b)
    {
        if(sol<Arb[nod])sol=Arb[nod];
        return;
    }
    int middle=(left+right)>>1;
    if(a<=middle)Querry(LS(nod),left,middle);
    if(middle<b )Querry(RS(nod),middle+1,right);


}
int main()
{
    f>>N>>M;
    for(poz=1;poz<=N;++poz)
    {
        f>>val;
        Update(1,1,N);
    }
    for(int i=1;i<=M;++i)
    {
        int op;
        f>>op>>a>>b;
        if(!op)
        {
            sol=-1;
            Querry(1,1,N);
            g<<sol<<'\n';
        }
        else
        {
            poz=a,val=b;
            Update(1,1,N);
        }
    }
    f.close();g.close();
    return 0;
}