Cod sursa(job #1414292)

Utilizator rangerChihai Mihai ranger Data 2 aprilie 2015 15:01:39
Problema Arbori de intervale Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include<fstream>

using namespace std;

const int N = 100003;
int n,m,o,i,Arb[4*N], A[N],a,b;

void Build(int nod, int left, int right)
{
    if (left == right) Arb[nod] = A[left];
     else {
        int mij = (left+right)/2;
        Build(2*nod,left, mij);
        Build(2*nod+1,mij+1,right);
        Arb[nod] = max(Arb[2*nod], Arb[2*nod+1]);
     }
}

void update(int nod, int left , int right, int pos, int val)
{
    if (left==right) Arb[nod]=val; else
    {
        int mij = (left + right)/2;
        if (pos <= mij) update(2*nod, left, mij, pos, val);
         else update(2*nod+1,mij+1,right,pos, val);
        Arb[nod] = max(Arb[2*nod], Arb[2*nod+1]);
    }
}

int Max(int nod, int left, int right, int a, int b)
{
    if (left == right) return Arb[nod];
    int mij= (left + right)/2;
    if (b <= mij) return  Max(2*nod,left, mij, a,b);
    if (a > mij)  return  Max(2*nod+1,mij+1,right,a,b);
    return  max ( Max(2*nod,left,mij, a,mij), Max(2*nod+1,mij+1,right,mij+1,b) );
}

int main()
{
    ifstream cin("arbint.in");
    ofstream cout("arbint.out");

    cin >> n >> m;
    for (i=1;i<=n;i++)
        cin>> A[i];

    Build(1,1,n);

    while (m--)
    {
        cin >> o >> a >> b;

        if (o == 0) cout << Max(1,1,n,a,b) << '\n';
           else update(1,1,n,a,b);
    }
    return 0;
}