Cod sursa(job #962335)

Utilizator CrescentselectJicol Crescent Crescentselect Data 14 iunie 2013 16:57:38
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <iostream>
#include <fstream>

using namespace std;

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

const int INF = 99999999;
int n,m,val,p,st,dr,poz;
int t[300009];

int maxim(int a, int b)
{
    if(a>b)
        return a;
    return b;
}
void update(int p, int a, int b)
{
    int m;
    if(a == poz && b == poz){
        t[p] = val;
        return;
    }
    m = (a+b)/2;
    if(poz<=m)
        update(p*2,a,m);
    if(poz>m)
        update(p*2+1,m+1,b);
    if(t[2*p]> t[2*p+1])
        t[p] = t[2*p];
    else
        t[p] = t[2*p+1];
}
int query(int p,int a,int b)
{
    if(st <= a && b<= dr)
        return t[p];
    int m = (a+b)/2;
    int r1,r2;
    if(st <= m)
        r1=query(2*p,a,m);
    else
        r1= -INF;
    if(dr>m)
        r2 = query(2*p+1,m+1,b);
    else
        r2 = -INF;
    return maxim(r1,r2);
}
void proces()
{
    int x,y,oper;
    f>>n>>m;
    for( poz=1;poz<=n;poz++)
    {
        f>>val;
        update(1,1,n);
    }
    for(int i=1;i<=m;i++)
    {
        f>>oper>>st>>dr;
        poz = st;
        val = dr;
        if( oper == 1)
        {
            update(1,1,n);
        }
        else{
            g<<query(1,1,n)<<'\n';
        }
    }
}

int main()
{
    proces();
    return 0;
}