Cod sursa(job #1641093)

Utilizator vancea.catalincatalin vancea.catalin Data 8 martie 2016 20:54:46
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include<iostream>
#include<fstream>
#define DX 100000
using namespace std;
fstream fin("arbint.in",ios::in),fout("arbint.out",ios::out);
int x[DX],ai[4*DX],maxi,n,m;

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

void query(int nod,int st,int dr,int stq,int drq)
{
    if(dr<stq || drq<st) return ;
    int m=(st+dr)/2,plod=nod*2;
    if(stq<=st && dr<=drq)
    {
        maxi=max(maxi,ai[nod]);
        return;
    }
    if(st==dr) return ;
    query(plod,st,m,stq,drq);
    query(plod+1,m+1,dr,stq,drq);
}
void update(int nod,int st,int dr,int pecine,int cuce)
{
    int m=(st+dr)/2,plod=nod*2;
    if(st==dr)
    {
        if(st==pecine) ai[nod]=x[st]=cuce;
        return ;
    }
    if(st<=pecine && pecine<=m)
        update(plod,st,m,pecine,cuce);
    if(m<pecine && pecine<=dr)
        update(plod+1,m+1,dr,pecine,cuce);
    ai[nod]=max(ai[plod],ai[plod+1]);
}
int main()
{
    int i,a,b,c;
    fin>>n>>m;
    for(i=1;i<=n;i++)
        fin>>x[i];
    build(1,1,n);
    for(i=1;i<=m;i++)
    {
        fin>>c>>a>>b;
        if(c==0)
        {
            maxi=-9;
            query(1,1,n,a,b);
            fout<<maxi<<"\n";
        }
        else
        {
            update(1,1,n,a,b);
        }
    }
}