Cod sursa(job #1092178)

Utilizator Dddarius95Darius-Florentin Neatu Dddarius95 Data 26 ianuarie 2014 17:45:35
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
// O(MlogN)
#include <fstream>
#include <algorithm>
#define Nmax 100099
#define oo 2000000000
#define LS(i) (i<<1)
#define RS(i) (i<<1)+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 st,int dr),Querry(int nod,int st,int dr);

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

void Querry(int nod,int st,int dr)
{
    if(A<=st && dr<=B)
    {
        if(sol<Arb[nod])sol=Arb[nod];
        return;
    }
    int mij=(st+dr)>>1;
    if(A<=mij)Querry(LS(nod),  st  ,mij);
    if(mij<B) Querry(RS(nod), mij+1,dr );
}

void Update(int nod,int st,int dr)
{
    if(st==dr){ Arb[nod]=val; return; }
    int mij=(st+dr)>>1,son1=nod<<1,son2=(nod<<1)+1;
    if(poz<=mij)Update(son1,  st ,mij);
           else Update(son2,mij+1,dr );
    if(Arb[son1]>Arb[son2]) Arb[nod]=Arb[son1];
                      else  Arb[nod]=Arb[son2];
}