Cod sursa(job #927658)

Utilizator SpiriFlaviuBerbecariu Flaviu SpiriFlaviu Data 25 martie 2013 22:25:03
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include <fstream>

using namespace std;

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

int v[4*100001],n,m,op;
int a[100001];

void create_arbore(int st, int dr, int nod)
{
    if(st == dr)
    {
        v[nod] = a[st];
        return;
    }
    int m = (st+dr)/2;
    create_arbore(st,m,2*nod);
    create_arbore(m+1,dr,2*nod+1);
    v[nod] = max(v[2*nod],v[2*nod+1]);
}

void update(int x, int y,int st, int dr,int nod)
{
    if(st>x)
        return;
    if(dr<x)
        return;
    if(st == dr)
    {
        v[nod] = y;
        while(nod)
        {
            nod>>=1;
            v[nod] = max(v[2*nod+1],v[2*nod]);
        }
        return;
    }
    int m = (st+dr)/2;
    update(x,y,st,m,2*nod);
    update(x,y,m+1,dr,2*nod+1);

}

int query(int qst, int qdr,int st, int dr,int nod)
{
    if(qst <= st && qdr >= dr)
        return v[nod];
    if(qst > dr || qdr < st)
        return -1;
    int m = (st+dr)/2;
    return max( query(qst,qdr,st,m,2*nod), query(qst,qdr,m+1,dr,2*nod+1) );

}

int main()
{
    fin>>n>>m;
    for(int i=1;i<=n;i++)
        fin>>a[i];
    create_arbore(1,n,1);
    for(int i=1;i<=m;i++)
    {
        int x,y;
        fin>>op>>x>>y;
        if(op==0)
            fout<<query(x,y,1,n,1)<<'\n';
        else update(x,y,1,n,1);
    }
    fin.close();
    fout.close();
    return 0;
}