Cod sursa(job #1110364)

Utilizator SpiriFlaviuBerbecariu Flaviu SpiriFlaviu Data 17 februarie 2014 23:50:28
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include <fstream>
#include <algorithm>

using namespace std;

ifstream fin("arbint.in");
ofstream fout("arbint.out");

int A[100001];
int arb[200002];
int n,m;

void create_AI(int nod, int st, int dr)
{

    int mij = (st+dr)/2;
    if(st == dr)
    {
        arb[nod] = A[st];
    }
    else if(st<dr)
    {
        create_AI(2*nod,st,mij);
        create_AI(2*nod+1,mij+1,dr);
        arb[nod] = max(arb[2*nod],arb[2*nod+1]);
    }
}

void update(int nod, int poz, int val, int st, int dr)
{

    if(st == dr)
    {
        arb[nod] = val;
        return;
    }
    int mij = (st+dr)/2;
    if(st<=poz && poz<=mij)
        update(2*nod,poz,val,st,mij);
    else if(mij+1<=poz && poz<=dr)
        update(2*nod+1,poz,val,mij+1,dr);
    arb[nod] = max(arb[2*nod],arb[2*nod+1]);
}

int query(int nod, int st, int dr, int qa, int qb )
{

    int mij = (st+dr)/2;
    if(qa == st && qb == dr)
        return arb[nod];
    if(st == dr)
        return arb[st];
    if(mij >= qb)
        return query(2*nod, st, mij, qa, qb);
    else if(mij +1 <= qa)
        return query(2*nod+1, mij+1, dr, qa, qb);
    else
        return max(query(2*nod,st,mij,qa,mij),query(2*nod+1,mij+1,dr,mij+1,qb));
}


int main()
{

    fin>>n>>m;
    for(int i=1;i<=n;i++)
        fin>>A[i];
    create_AI(1,1,n);
    for(int i=1;i<=m;i++)
    {
        int op,a,b;
        fin>>op>>a>>b;
        if(op == 1)
            update(1,a,b,1,n);
        else fout<<query(1,1,n,a,b)<<'\n';
    }

    fin.close();
    fout.close();
    return 0;
}