Cod sursa(job #1046363)

Utilizator leontinLeontin leontin Data 2 decembrie 2013 21:07:23
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
#include<fstream>
using namespace std;
#define N 100005
int init[N],n,m,v[4*N+50],p1,p2;

void cstr(int st,int dr,int poz)
{
    if(st==dr)
    {
        init[st]=poz;
        return ;
    }
    int mijl=(st+dr)/2;
    cstr(st,mijl,poz*2);
    cstr(mijl+1,dr,poz*2+1);
}

void update(int poz,int val)
{
    int x=init[poz];
    v[x]=val;
    for(x/=2; x>0; x/=2)
        v[x]=max(v[2*x],v[2*x+1]);
}

int query(int st,int dr,int poz)
{
    if(p2<st||p1>dr)
        return 0;
    int x;
    if(p1<=st&&dr<=p2)
        return v[poz];

    int mijl=(st+dr)/2;

    return max(query(st,mijl,2*poz),query(mijl+1,dr,2*poz+1));
}

int main()
{
    ifstream f("arbint.in");
    ofstream g("arbint.out");
    f>>n>>m;
    int i,o,x;
    cstr(1,n,1);

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





    for(i=1; i<=m; ++i)
    {
        f>>o>>p1>>p2;

        if(o==0)
            g<<query(1,n,1)<<'\n';
        else
            update(p1,p1);
    }

    f.close();
    g.close();

    return 0;
}