Cod sursa(job #2625784)

Utilizator CoakazeRotaru Catalin Coakaze Data 6 iunie 2020 10:12:19
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.66 kb
#include <iostream>
#include <fstream>
const int N=1000004;
using namespace std;

int v[1000001], a[1000001], maxi;

int maximum(int x, int y)
{
    if(x >= y)
        return x;
    return y;
}

void constructie( int s, int d, int nr)
{
    if(s == d)
        v[nr] = a[d];
    else
    {
        int mijl = (s + d) / 2;
        constructie(s, mijl, nr*2);
        constructie(mijl+1, d, nr*2+1);
        v[nr] = maximum(v[2*nr], v[2*nr + 1]);
    }
}

void operatie0(int nr, int s, int d, int pozitie)
{
    if(s==d)
    {
        v[nr]=a[s];
        return;
    }
    else
    {
        int mijl = (s + d) / 2;
        if(pozitie <= mijl)
            operatie0(nr * 2, s, mijl, pozitie);
        else
            operatie0(nr * 2 +1, mijl+ 1, d, pozitie);


        v[nr] = maximum(v[nr * 2], v[nr * 2 + 1]);
    }
}
void operatie1(int nr, int s, int d, int x, int y)
{
    if(x<=s && y>=d)
    {
        if(maxi<v[nr])
            maxi=v[nr];
    }
    else
    {
        int mijl=(s+d)/2;
        if(x<=mijl)
            operatie1(nr*2,s,mijl,x,y);
        if(y>mijl)
            operatie1(nr*2+1,mijl+1,d,x,y);
    }
}
int main()
{
    ifstream f("arbint.in");
    ofstream g("arbint.out");
    int n, m, op, m1, m2;
    f>>n>>m;
    for(int i=1; i<=n; i++)
        f>>a[i];
    constructie(1, n, 1);
    for(int i=0; i<m; i++)
    {
        f>>op>>m1>>m2;
        if(op == 0)
        {
            maxi = 0;
            operatie1(1, 1, n, m1, m2);
            cout<<maxi<<'\n';
        }
        else
        {
            a[m1] = m2;
            operatie0(1, 1, n, m1);
        }
    }
    return 0;
}