Cod sursa(job #1623771)

Utilizator vancea.catalincatalin vancea.catalin Data 1 martie 2016 21:34:42
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include<iostream>
#include<fstream>
#define DX 100000
using namespace std;
fstream fin("arbint.in",ios::in),fout("arbint.out",ios::out);
int v[DX],ai[4*DX],maxi;

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

void arbint(int nod,int st,int dr,int qst,int qdr)
{

    if(dr<qst || qdr<st) return ;
    int m=(st+dr)/2,plod=nod*2;
    if(qst<=st && dr<=qdr)
    {
        maxi=max(maxi,ai[nod]);
        return ;
    }
    if(st==dr) return ;
    arbint(plod,st,m,qst,qdr);
    arbint(plod+1,m+1,dr,qst,qdr);
}


void update(int nod,int st,int dr,int pecine,int val)
{
    if(st==dr)
    {
        if(st==pecine) ai[nod]=val;
        return ;
    }
    int m=(st+dr)/2,plod=nod*2;
    if(st<=pecine && pecine<=m)
        update(plod,st,m,pecine,val);
    if(m<pecine && pecine<=dr)
        update(plod+1,m+1,dr,pecine,val);
    ai[nod]=max(ai[plod],ai[plod+1]);
}


int main()
{
    int m,n,i,j,a,b,c;
    fin>>n>>m;
    for(i=1;i<=n;i++) fin>>v[i];
    build(1,1,n);
    for(i=1;i<=m;i++)
    {
        fin>>a>>b>>c;
        if(a==0)
        {
            maxi=0;
            arbint(1,1,n,b,c);
            fout<<maxi<<"\n";
        }
        else
        {
            v[a]=b;
            update(1,1,n,b,c);
        }
    }
}