Cod sursa(job #740017)

Utilizator ioanabIoana Bica ioanab Data 24 aprilie 2012 15:39:28
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <fstream>
using namespace std;

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

const int inf=0x3f3f3f3f;
const int N=500006;

int aint[N],rez_aint,n;

inline int max(int a,int b)
{
    return a > b ? a : b;
}

void update(int poz,int st,int dr,int x,int val)
{
    if(st==dr)
    {
        aint[poz]=val;
        return;
    }

    int m=(st+dr)/2,S=poz*2,D=S+1;

    if(x<=m)
        update(S,st,m,x,val);
    else
        update(D,m+1,dr,x,val);

    aint[poz]=max(aint[S],aint[D]);
}

void query(int poz,int st, int dr,int x,int y)
{
    if(x<=st && dr<=y)
    {
        rez_aint=max(rez_aint,aint[poz]);
        return;
    }

    int m=(st+dr)/2,S=poz*2,D=S+1;

    if(x<=m)
        query(S,st,m,x,y);
    if(y>m)
        query(D,m+1,dr,x,y);
}

int query(int x,int y)
{
    rez_aint=-inf;
    query(1,1,n,x,y);
    return rez_aint;
}

int main()
{
    int m,x,y,q,i;
    in>>n>>m;

    for(i=1;i<=n;i++)
    {
        in>>x;
        update(1,1,n,i,x);
    }

    while(m--)
    {
        in>>q>>x>>y;
        if(q)
            update(1,1,n,x,y);
        else
            out<<query(x,y)<<"\n";
    }
    return 0;
}