Cod sursa(job #1075928)

Utilizator handz.FMI Andrei Tanasescu handz. Data 9 ianuarie 2014 18:54:12
Problema Arbori de intervale Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 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],poz,val,A,B,maxim;

void modif(int s,int p,int q)
{
    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);
    else modif(s*2+1,mij+1,q);

    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 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);
    if(mij<B) getMax(s*2+1,mij+1,q);
}

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

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

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

            g<<maxim<<endl;
        }
    }



    return 0;
}