Cod sursa(job #2381164)

Utilizator Mirela_MagdalenaCatrina Mirela Mirela_Magdalena Data 16 martie 2019 10:22:03
Problema Arbori de intervale Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.45 kb
#include <fstream>
#include <algorithm>
using namespace std;

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


int M, N, T, x, y;
int arb[400010];
int a[100010];


void form_arb(int st, int dr, int poz)
{
    if(st > dr)
        return;
    if(st == dr)
    {
        arb[poz] = a[dr];
        return;
    }
    int mj = (st + dr-1)/2;
    form_arb(st, mj, 2*poz);
    form_arb(mj+1, dr, 2*poz+1);
    arb[poz] = max(arb[2*poz], arb[2*poz+1]);
}





int intreb(int st, int dr, int poz)
{
    if(x <= st && y >= dr)
        return arb[poz];
    if(x < st && y < st || x > dr && y > dr)
        return 0;
    int mj = (st + dr-1)/2, g, h;
    if(mj < st)
        g = 0;
    else  g = intreb(st, mj, 2*poz);

    if(mj > dr)
        h = 0;
    else h = intreb(mj+1, dr, 2*poz+1);
    return max(g, h);
}







void schimb(int st, int dr, int poz)
{
    if(st > dr)
        return;
    if(st == dr)
    {
        if(st == x)
            arb[poz] = y;
        return;
    }
    int mj = (st + dr-1)/2;
    schimb(st, mj, 2*poz);
    schimb(mj+1, dr, 2*poz+1);
    arb[poz] = max(arb[2*poz], arb[2*poz+1]);
}







int main()
{
    f>>N>>M;
    for(int i=1; i<=N; ++i)
    {
        f>>a[i];
    }
    form_arb(1, N, 1);
    for(int j=1; j<=M; j++)
    {
        f>>T>>x>>y;
        if(T == 0)
            g<<intreb(1, N, 1)<<'\n';
        else schimb(1, N, 1);
    }

    return 0;
}