Cod sursa(job #2187212)

Utilizator cyg_ieeuVasile Radu-Andrei cyg_ieeu Data 26 martie 2018 12:15:27
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include <cstdio>
#include <algorithm>
using namespace std;
int aint[400010];
int v[100010];
int n,m,a,b,p,i,x,t,sol;

void build(int nod,int st,int dr)
{
    if(st == dr)
        aint[nod] = v[st];
    else
    {
        int med = (st + dr) / 2;
        build(2 * nod,st,med);
        build(2 * nod + 1,med + 1,dr);
        aint[nod] = max(aint[2 * nod],aint[2*nod + 1]);
    }
}

void update(int nod,int st,int dr,int pozv,int new_val)
{
    if(st == dr)
        aint[nod] = new_val;
    else
    {
        int med = (st + dr) / 2;
        if(pozv <= med)
            update(2 * nod,st,med,pozv,new_val);
        if(pozv >= med + 1)
            update(2 * nod + 1,med + 1,dr,pozv,new_val);
        aint[nod] = max(aint[2 * nod], aint[2 * nod + 1]);
    }
}

void query(int nod,int st,int dr,int a,int b)
{
    if(a <= st && dr <= b)
        sol = max(sol,aint[nod]);
    else
    {
        int med = (st + dr) / 2;
        if(a <= med)
            query(2 * nod,st,med,a,b);
        if(b >= med + 1)
            query(2 * nod + 1,med + 1,dr,a,b);
    }
}
int main()
{
    freopen("arbint.in", "r",stdin);
    freopen("arbint.out", "w",stdout);
    int n,m,i,misu,face,sex;
    scanf("%d%d", &n, &m);
    for(i = 1;i <= n;i++)
        scanf("%d", &v[i]);
    build(1,1,n);
    for(i = 1;i <= m;i++)
    {
        scanf("%d%d%d", &misu, &face, &sex);
        if(misu == 1)
            update(1,1,n,face,sex);
        else if(misu == 0)
        {
            sol = 0;
            query(1,1,n,face,sex);
            printf("%d\n",sol);
        }
    }
    return 0;
}