Cod sursa(job #1315594)

Utilizator Denisa13Stefan Denisa Denisa13 Data 12 ianuarie 2015 22:09:34
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include <iostream>
#include <fstream>

using namespace std;

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

long m,n,a[100005],arb[200010];

long constructie_arbore (long poz, long st, long dr)
{
    if(dr==st)
    {
        arb[poz]=a[st];
        return arb[poz];
    }
    else
    {
        long m1, m2;
        m1=constructie_arbore(2*poz,st,(st+dr)/2);
        m2=constructie_arbore(2*poz+1,(st+dr)/2+1,dr);
        if(m1>m2)
            arb[poz]=m1;
        else arb[poz]=m2;
        return arb[poz];
    }
}
void actualizare (long p, long poz, long st, long dr)
{
    if(st==dr)
        arb[poz]=a[p];
    else {
    if(p<=(st+dr)/2)
        actualizare(p, 2*poz, st, (st+dr)/2);
    else actualizare (p, 2*poz+1, (st+dr)/2+1, dr);
    }
}
int maxim (long a, long b, long poz, long st, long dr)
{
    if(a<=st && dr<=b)
        return arb[poz];
    long m1=0,m2=0;
    if(a<=(st+dr)/2)
        m1=maxim(a,b,2*poz,st,(st+dr)/2);
    if(b>(st+dr)/2)
        m2=maxim(a,b,2*poz+1,(st+dr)/2+1,dr);
    if(m1>m2)
        return m1;
    else return m2;
}
int main()
{
    long i,j,t,p,p1,p2,x,max;
    f>>n>>m;
    for(i=1;i<=n;i++)
        f>>a[i];
    max=constructie_arbore(1,1,n);
    for(i=1;i<=2*n-1;i++)
        cout<<arb[i]<<' ';
    for(i=1;i<=m;i++)
    {
        f>>t;
        if(t==0)
        {
            f>>p1>>p2;
            g<<maxim(p1,p2,1,1,n)<<endl;
        }
        if(t==1)
        {
            f>>p>>x;
            a[p]=x;
            actualizare(p,1,1,n);
        }
    }
    return 0;
}