Cod sursa(job #827128)

Utilizator R.A.RFMI Romila Remus Arthur R.A.R Data 1 decembrie 2012 17:34:31
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <fstream>
#define  INF 2147483647
#define NMAX 262144
#define LS(p) (p<<1)
#define RS(p) ((p<<1)+1)
using namespace std;

ifstream in("arbint.in");
ofstream out("arbint.out");

int V[NMAX],N,T;

inline int _max(int a,int b){if(a>b)return a;return b;}

void Insert(int p,int poz,int s,int f,int val)
{
    if(s == f)
        V[p] = val;
    else
    {
        int med = (s+f)/2;
        if(poz<=med)
            Insert(LS(p),poz,s,med,val);
        else
            Insert(RS(p),poz,med+1,f,val);
        V[p] = _max(V[LS(p)],V[RS(p)]);
    }
}

int Query(int p,int s,int f,int a,int b)
{
    int med = (s+f)/2,v1 = -INF ,v2 = -INF ;
    if(s>=a&&f<=b)
        return V[p];
    if(med>=a)
        v1 = Query(LS(p),s,med,a,b);
    if(med<b)
        v2 = Query(RS(p),med+1,f,a,b);
    return _max(v1,v2);
}


int main()
{
    int i,x,a,b;
    bool op;
    in>>N>>T;
    for(i=1;i<=N;i++)
        in>>x,Insert(1,i,1,N,x);
    while(T--)
    {
        in>>op>>a>>b;
        if(op)
            Insert(1,a,1,N,b);
        else
        {
            out<<Query(1,1,N,a,b)<<'\n';
        }
    }
    return 0;
}