Cod sursa(job #1642857)

Utilizator SlevySlevoaca Stefan-Gabriel Slevy Data 9 martie 2016 16:35:20
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include <iostream>
#include <fstream>
#include <algorithm>

using namespace std;

const int NMAX = 100001;
int n,m;
int AI[2*NMAX-1];

void Update(int,int,int,int,int);
void citire()
{
    scanf("%d %d",&n,&m);
    int x;
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&x);
        Update(1,1,n,i,x);
    }
}

void Update(int nod,int st,int dr,int a,int value)
{
    if(st==dr)
    AI[nod] = value;
    else
    {
        int mij=(st+dr)/2;
        if(a<=mij)
            Update(2*nod,st,mij,a,value);
        if(a>mij)
            Update(2*nod+1,mij+1,dr,a,value);
        if(2*nod<2*NMAX-1)
            AI[nod] = AI[2*nod];
        if(2*nod+1<2*NMAX-1)
        AI[nod] = max(AI[nod],AI[2*nod+1]);
    }
}

int Query(int nod,int st,int dr,int a,int b)
{
    if(a<=st && dr<=b)
        return AI[nod];
    else
    {
        int m1=-1,m2=-1;
            int mij = (st+dr)/2;
            if(a<=mij)
                m1 = Query(2*nod,st,mij,a,b);
            if(b > mij)
                m2 = Query(2*nod+1,mij+1,dr,a,b);
            return max(m1,m2);
    }
}

int main()
{
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    citire();
    int q,a,b;
    for(int i=1;i<=m;i++)
    {
        scanf("%d",&q);
        scanf("%d %d",&a,&b);
        if(q==0)
        {
            printf("%d\n",Query(1,1,n,a,b));
            continue;
        }
        if(q==1)
        {
            Update(1,1,n,a,b);
            continue;
        }
    }
    fclose(stdin);
    fclose(stdout);
    return 0;
}