Cod sursa(job #1829349)

Utilizator zdavid112zIon David-Gabriel zdavid112z Data 14 decembrie 2016 20:30:48
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include <cstdio>
#include <algorithm>

using namespace std;

int v[1 << 18 + 3];
int n, m;
int maxim;

void update(int pos, int st, int dr, int pv, int val)
{
    if(st == dr)
        v[pos] = val;
    else
    {
        int mij = (st + dr) / 2;
        if(pv <= mij)
            update(2 * pos, st, mij, pv, val);
        else update(2 * pos + 1, mij + 1, dr, pv, val);
    }
}

void getmax(int pos, int st, int dr, int isd, int idd)
{
    if(st == dr)
        maxim = max(maxim, v[pos]);
    else
    {
        int mij = (st + dr) / 2;
        if(isd <= mij)
            getmax(2 * pos, st, mij, isd, idd);
        if(mij + 1 <= idd)
            getmax(2 * pos + 1, mij + 1, dr, isd, idd);
    }
}

int main()
{
    int i, j, a, b, c;
    freopen("arbint.in", "r", stdin);
    freopen("arbint.out", "w", stdout);
    scanf("%d%d", &n, &m);
    for(i = 1; i <= n; i++)
    {
        scanf("%d", &a);
        update(1, 1, n, i, a);
    }
    for(i = 1; i <= m; i++)
    {
        scanf("%d%d%d", &c, &a, &b);
        if(c == 0)
        {
            maxim = -1;
            getmax(1, 1, n, a, b);
            printf("%d\n", maxim);
        }
        else
        {
            update(1, 1, n, a, b);
        }
    }
    return 0;
}