Cod sursa(job #2544644)

Utilizator Alex62493Manghiuc Alexandru Alex62493 Data 12 februarie 2020 12:23:25
Problema Arbori de intervale Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.34 kb
#include <cstdio>
#include <iostream>

using namespace std;

int n, arb[200002], m, v;

FILE* fin=fopen("arbint.in", "r");
FILE* fout=fopen("arbint.out", "w");

int Citire(int nod, int st, int dr, int a, int b)
{
    if (a<=st && b>=dr)
        return arb[nod];
    else
    {
        int x=0, y=0, mid=(st+dr)/2;
        if (a<=mid)
            y=Citire(nod*2, st, mid, a, b);
        if (b>mid)
            x=Citire(nod*2+1, mid+1, dr, a, b);
        return max(x, y);
    }
}

void Actualizare(int nod, int st, int dr, int poz, int nr)
{
    if (st==dr)
    {
        arb[nod]=nr;
    }
    else
    {
        int mid=(st+dr)/2;
        if (poz<=mid)
            Actualizare(nod*2, st, mid, poz, nr);
        else
            Actualizare(nod*2+1, mid+1, dr, poz, nr);
        arb[nod]=max(arb[nod*2], arb[nod*2+1]);
    }
}

int main()
{
    fscanf(fin, "%d%d", &n, &m);
    for (int i=1; i<=n; i++)
    {
        fscanf(fin, "%d", &v);
        Actualizare(1, 1, n, i, v);
    }
    for (int i=1; i<=m; i++)
    {
        int x, a, b;
        fscanf(fin, "%d%d%d", &x, &a, &b);
        if (!x)
        {
            fprintf(fout, "%d\n", Citire(1, 1, n, a, b));
        }
        else
        {
            Actualizare(1, 1, n, a, b);
        }
    }
    fclose(fin);
    fclose(fout);
    return 0;
}