Cod sursa(job #897212)

Utilizator dtoniucDaniel Toniuc dtoniuc Data 27 februarie 2013 19:23:35
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <iostream>
#include <fstream>
#define NMAX 100010
using namespace std;

int arb[4*NMAX+66];
int n,m,poz,val,start,finish,maxim;

void insert(int nod,int left,int right)
{
    if(left==right)
    {
        arb[nod]=val;
        return;
    }

    int div=(left+right)/2;
    if(poz<=div) insert(2*nod,left,div);
    else insert(2*nod+1,div+1,right);

    arb[nod]=max(arb[2*nod],arb[2*nod+1]);
}

void query(int nod,int left,int right)
{
    if(start <= left && right <= finish)
    {
        if(maxim<arb[nod]) maxim=arb[nod];
        return;
    }

    int div=left+(right-left)/2;
    if(start <= div) query(2*nod, left, div);
    if(finish >  div) query(2*nod+1, div+1, right);
}
int main()
{
    ifstream fin("arbint.in");
    ofstream fout("arbint.out");
    fin>>n>>m;
    int tip,x,y;
    for(int i=1;i<=n;i++)
    {
        fin>>x;
        poz=i;val=x;
        insert(1,1,n);
    }

    for(int i=1;i<=m;i++)
    {
        fin>>tip>>x>>y;
        if(tip==0)
        {
            maxim=-1;
            start=x;finish=y;
            query(1,1,n);
            fout<<maxim<<'\n';
        }
        else
        {
            poz=x;val=y;
            insert(1,1,n);
        }
    }
    return 0;
}