Cod sursa(job #1960103)

Utilizator Firealex2Rotileanu Alexandru Firealex2 Data 10 aprilie 2017 10:46:02
Problema Arbori de intervale Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include <fstream>
#include <queue>
#include <algorithm>
#include <vector>


using namespace std;

ifstream fi("arbint.in");
ofstream fo("arbint.out");

int tree[100001], numere[100001];
int N,M;


void create_tree(int nod, int st, int dr);
int interogare(int nod, int st, int dr, int a, int b);
void init();
int maxim(int a, int b)
{
    return (a)>(b)?(a):(b);
}

int main()
{
    init();
    for(int i=1;i<=M;i++)
    {
        int p, a, b;
        fi>>p>>a>>b;
        if(p==1)
            numere[a] = b, create_tree(1,1,N);
        else if(p==0)
            fo<<interogare(1,1,N,a,b)<<"\n";
    }


    return 0;

}

void init()
{
    fi>>N>>M;
    for(int i=1;i<=N;i++)
        fi>>numere[i];
    create_tree(1,1,N);
    return;
}

void create_tree(int nod, int st, int dr)
{
    if(st==dr)
        {
            tree[nod] = numere[st];
            return;
        }
    int m = (st+dr)/2;
    create_tree(2*nod,st,m);
    create_tree(2*nod+1,m+1,dr);
    tree[nod] = maxim(tree[2*nod], tree[2*nod+1]);
    return;
}

int interogare(int nod, int st, int dr, int a, int b)
{
    if(a<=st && b>=dr)
        return tree[nod];
    else
    {
        int m = (st+dr)/2;
        int x=0,y=0;
        if(a<=m)
            x = interogare(2*nod,st,m,a,b);
        if(b>m)
            y = interogare(2*nod+1,m+1,dr,a,b);
        return maxim(x,y);
    }
}