Cod sursa(job #1929861)

Utilizator vlad6001Pintilie Vlad vlad6001 Data 18 martie 2017 11:04:18
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.69 kb
#include <fstream>
using namespace std;

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

int arbore[420003], val, elemente, operatii, i, a, b, maxim, tip, v[100003];

void initializeaza(int poz, int s, int d)
{
    if(s < d)
    {
        int m = (s+d)/2;
        initializeaza(poz*2, s, m);
        initializeaza(poz*2+1, m+1, d);
        arbore[poz] = max(arbore[poz*2], arbore[poz*2+1]);
    }
    else
        arbore[poz] = v[s];
}

void update(int poz, int s, int d) // pun val pe pozitia "poz"
{
    if(d-s == 0)
    {
        arbore[poz] = val;
    }
    else
    {
        int m = (s+d)/2;
        if(i <= m)
        {
            update(poz*2, s, m);
        }
        else
        {
            update(poz*2+1, m+1, d);
        }
        arbore[poz] = max(arbore[poz*2], arbore[poz*2+1]);
    }
}

void intrebare(int poz, int s, int d)
{
    if(s >= a && d <= b)
    maxim = max(maxim, arbore[poz]);
    else
    {
        int m = (s+d)/2;
        if(a <= m)
        {
            intrebare(poz*2, s, m);
        }
        if(m+1 <= b)
        {
            intrebare(poz*2+1, m+1, d);
        }
    }
}

int main()
{
    cin >> elemente >> operatii;
    for(i=1; i <= elemente; i++)
    {
        cin >> v[i];
        //update(1, 1, elemente);
    }
    initializeaza(1, 1, elemente);
    for(int yy=1; yy <= operatii; yy++)
    {
        cin >> tip;
        if(tip == 1)
        {
            cin >> i >> val;
            update(1, 1, elemente);
        }
        else
        {
            cin >> a >> b;
            maxim = -1;
            intrebare(1, 1, elemente);
            cout << maxim << '\n';
        }
    }
}