Cod sursa(job #1075919)

Utilizator handz.FMI Andrei Tanasescu handz. Data 9 ianuarie 2014 18:41:40
Problema Arbori de intervale Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <iostream>
#include <fstream>
using namespace std;

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

#define maxN 500005
#define MIN -maxN
int n,m,v[maxN];

void modif(int s,int p,int q,int poz,int val)
{
    int mij;

    if(p==q)
    {
        v[s]=val; // e doar un element - am ajuns la cel care trebuie modificat
        return;
    }

    mij=(p+q)/2; // jumatatea intervalului

    if(poz<=mij) modif(s*2,p,mij,poz,val);
    else modif(s*2+1,mij+1,q,poz,val);

    if(v[s*2]>v[s*2+1]) v[s]=v[s*2];
    else v[s]=v[s*2+1];

}

void getMax(int s,int p,int q,int a,int b,int &maxim)
{
    int mij;
    if(a<=p && q<=b)
    {
        // maximul din int [a,b] este valoarea lui v[s], unde s este rad subarborelui
        if(v[s]>maxim) maxim=v[s];
        return;
    }

    mij=(p+q)/2;
    if(a<=mij) getMax(s*2,p,mij,a,b,maxim);
    if(mij<b) getMax(s*2+1,mij+1,q,a,b,maxim);
}

int main()
{
    int i,x,a,b,maxim;
    f>>n; f>>m;

    for(i=1; i<=n ;i++)
    {
        f>>x;
        // adaugam elem in structura, respectand structura de ArbInt
        modif(1,1,n,i,x);
    }

    for(i=1; i<=m ;i++)
    {
        f>>x; f>>a; f>>b;
        if(x==1) modif(1,1,n,a,b);
        else
        {
            maxim=MIN;
            getMax(1,1,n,a,b,maxim);

            g<<maxim<<endl;
        }
    }

    return 0;
}