Cod sursa(job #584784)

Utilizator mihai995mihai995 mihai995 Data 26 aprilie 2011 18:28:20
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <fstream>
using namespace std;

const int N=100002,inf=1<<30;
int v[3*N],n,val;

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

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)
    {
        v[poz]=val;
        return;
    }
    int m=(st+dr)>>1,S=poz<<1,D=S+1;
    if (x<=m)
        update(S,st,m,x,val);
    else
        update(D,m+1,dr,x,val);
    v[poz]=max(v[S],v[D]);
}

void query(int poz,int st,int dr,int x,int y)
{
    if (x<=st && dr<=y)
    {
        val=max(val,v[poz]);
        return;
    }
    int m=(st+dr)>>1,S=poz<<1,D=S+1;
    if (x<=m)
        query(S,st,m,x,y);
    if (m<y)
        query(D,m+1,dr,x,y);
}

int query(int x,int y)
{
    val=0;
    query(1,1,n,x,y);
    return val;
}

int main()
{
    int m,i,x,y,c;
    in>>n>>m;
    for (i=1;i<=n;i++)
    {
        in>>x;
        update(1,1,n,i,x);
    }
    while (m--)
    {
        in>>c>>x>>y;
        if (!c)
            out<<query(x,y)<<"\n";
        else
            update(1,1,n,x,y);
    }
    return 0;
}