Cod sursa(job #1661509)

Utilizator LucianTLucian Trepteanu LucianT Data 23 martie 2016 22:12:42
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <bits/stdc++.h>
#define maxN 100005
using namespace std;
int arb[4*maxN], x, n, i, j, m, val, poz, start, stop, maxx, op, a, b;
void update(int nod, int st, int dr)
{
    int mij;
    if(st == dr)
    {
        arb[nod]=val;
        return;
    }
    mij=(st+dr)>>1;
    if(poz <= mij) update(2*nod, st, mij);
    else update(2*nod+1, mij+1, dr);
    arb[nod]=max(arb[2*nod], arb[2*nod+1]);
}
void query(int nod, int st, int dr)
{
    if(start <= st && dr <= stop)
    {
        maxx=max(maxx, arb[nod]);
        return;
    }
    int mij=(st+dr)>>1;
    if(start <= mij) query(2*nod, st, mij);
    if(mij+1 <= stop) query(2*nod+1, mij+1, dr);
}
int main()
{
    freopen("arbint.in", "r", stdin);
    freopen("arbint.out", "w", stdout);
    scanf("%d %d", &n, &m);
    for(i = 1; i <= n; i++)
    {
        scanf("%d", &x);
        poz=i, val=x;
        update(1, 1, n);
    }
    while(m--)
    {
        scanf("%d", &op);
        if(!op)
        {
            maxx=-1;
            scanf("%d %d", &start, &stop);
            query(1, 1, n);
            printf("%d\n", maxx);
        }
        else
        {
            scanf("%d %d", &poz, &val);
            update(1, 1, n);
        }
    }
    return 0;
}