Cod sursa(job #1639913)

Utilizator secretCCMniciun nume secretCCM Data 8 martie 2016 14:41:21
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include <iostream>
#include <fstream>

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

const int Nmax = 400005;
int n, m, G[Nmax], maxim;

void Maxim(int a, int b, int left, int right, int nod)
{
    if(left >= a && b >= right)
    {
        maxim = max(maxim, G[nod]);
        return;
    }
    else
    {
        int mid = (left+right)/2;
        if(a <= mid) Maxim(a,b,left,mid,2*nod);
        if(b > mid) Maxim(a,b,mid+1,right,2*nod+1);
    }
}

void Update(int val, int pos, int left, int right, int nod)
{
    if(left == right)
    {
        G[nod] = val;
        return;
    }
    else
    {
        int mid = (left+right)/2;
        if(pos <= mid) Update(val,pos,left,mid,2*nod);
        else Update(val,pos,mid+1,right,2*nod+1);
        G[nod] = max(G[2*nod], G[2*nod+1]);
    }
}

int main()
{
    f>>n>>m;
    for(int i = 1; i <= n; i++)
    {
        int x;
        f>>x;
        Update(x,i,1,n,1);
    }
    while(m--)
    {
        int opt, a, b;
        f>>opt>>a>>b;
        if(opt == 1) Update(b,a,1,n,1);
        else
        {
            maxim = -1;
            Maxim(a,b,1,n,1);
            g<<maxim<<'\n';
        }
    }
    return 0;
}