Cod sursa(job #1814528)

Utilizator kikiandreiCristian Andrei Popescu kikiandrei Data 24 noiembrie 2016 09:47:02
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include <iostream>
#include <fstream>

using namespace std;

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

int v[100001],N,M,A[400001],maxint;

int MAX(int a, int b)
{
    if (a>b) return a;
    else return b;
}

void build(int n, int s, int d)
{
    if (s==d) A[n]=v[s];
    else
    {
        int m=(s+d)/2;
        build (2*n,s,m);
        build (2*n+1,m+1,d);
        A[n]=MAX(A[2*n], A[2*n+1]);
    }
}

void update(int n, int s, int d, int i, int f)
{
    if (s==d) A[n]=f;
    else
    {
        int m=(s+d)/2;
        if (i<=m) update(2*n,s,m,i,f);
        else update(2*n+1,m+1,d,i,f);
        A[n]=MAX(A[2*n],A[2*n+1]);
    }
}

void query(int n, int s, int d, int a, int b)
{
    if (a<=s&&d<=b)
    {
        maxint=MAX(A[n],maxint);
    }
    else
    {
        int m=(s+d)/2;
        if (a<=m) query(2*n,s,m,a,b);
        if (b>m) query(2*n+1,m+1,d,a,b);
    }
}

int main()
{
    in>>N>>M;
    for (int i=1; i<=N; i++) in>>v[i];
    build(1,1,N);
    int cod,a,b;
    for (int i=1; i<=M; i++)
    {
        in>>cod>>a>>b;
        if(cod==0)
        {
            maxint=0;
            query(1,1,N,a,b);
            out<<maxint<<'\n';
        }
        else update(1,1,N,a,b);
    }
    return 0;
}