Cod sursa(job #827142)

Utilizator R.A.RFMI Romila Remus Arthur R.A.R Data 1 decembrie 2012 17:43:33
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include <fstream>
#define  INF 2147483647
#define NMAX 262144
#define TLIM 1<<20
#define verifica ++contor == TLIM ? in.read(Text,TLIM),contor = 0 : 0
#define LS(p) (p<<1)
#define RS(p) ((p<<1)+1)
using namespace std;

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

/**********************************/
char Text[TLIM+4];
int contor;
inline void Citeste(int &n)
{
    if(Text[contor] == '\0')in.read(Text,TLIM);
    else for(;Text[contor]<'0'||Text[contor]>'9';verifica);
    for(n = 0; Text[contor]>='0'&&Text[contor]<='9';n = n*10 + Text[contor]-'0',verifica);
}

/**********************************/

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,op;
    Citeste(N),Citeste(T);
    for(i=1;i<=N;i++)
        Citeste(x),Insert(1,i,1,N,x);
    while(T--)
    {
        Citeste(op),Citeste(a),Citeste(b);
        if(op)
            Insert(1,a,1,N,b);
        else
        {
            out<<Query(1,1,N,a,b)<<'\n';
        }
    }
    return 0;
}