Cod sursa(job #1852658)

Utilizator vancea.catalincatalin vancea.catalin Data 21 ianuarie 2017 00:43:10
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include<iostream>
#include<fstream>
#define DN 100100
using namespace std;
fstream fin("arbint.in",ios::in),fout("arbint.out",ios::out);
int arb[4*DN],n,m;
int find(int a,int b,int ind,int nod)
{
    int m;
    if(a==b) return nod;
    m=(a+b)/2;
    if(a<=ind && ind<=m) return find(a,m,ind,nod*2);
    if(m<ind && ind<=b) return find(m+1,b,ind,nod*2+1);

}
void update(int nod)
{
    if(nod==0) return ;
    arb[nod]=max(arb[2*nod],arb[2*nod+1]);
    update(nod/2);
}
int query(int nod,int st,int dr,int a,int b)
{
    int m=(st+dr)/2,aux=0;
    if(a<=st && dr<=b) return arb[nod];
    if(!(b<st || m<a)) aux=max(aux,query(nod*2,st,m,a,b));
    if(!(b<=m || dr<a)) aux=max(aux,query(nod*2+1,m+1,dr,a,b));
    return aux;
}
int main()
{
    int i,t,a,b,poz;
    fin>>n>>m;
    for(i=1;i<=n;i++)
    {
        fin>>a;
        poz=find(1,n,i,1);
        arb[poz]=a;
        update(poz/2);
    }
    for(i=1;i<=m;i++)
    {
        fin>>t>>a>>b;
        if(t==1)
        {
            poz=find(1,n,a,1);
            arb[poz]=b;
            update(poz/2);
        }
        else
        {
            fout<<query(1,1,n,a,b)<<"\n";
        }
    }
}