Cod sursa(job #1777093)

Utilizator amaliarebAmalia Rebegea amaliareb Data 12 octombrie 2016 02:12:33
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.91 kb
#include <iostream>
#include <fstream>

using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int n,i,j,st,dr,p,v[100001],aint[265000],poz,m,x,a,b,lefti,righti;

inline void dfs(int p, int st, int dr)
{
    if(st==dr) aint[p]=v[st];
    else
    {
        int m=(st+dr)/2;
        dfs(2*p,st,m);
        dfs(2*p+1,m+1,dr);
        aint[p]=max(aint[2*p],aint[2*p+1]);
    }
}

inline void update()
{
    int p=1, st=1, dr=n, m;
    while(st<dr)
    {
        m=(st+dr)/2;
        if(poz>m) st=m+1, p=2*p+1;
        else dr=m, p=2*p;
    }
    aint[p]=v[st];
    p/=2;
    while(p)
    {
        aint[p]=max(aint[2*p],aint[2*p+1]);
        p/=2;
    }
}

inline int query()
{
    int p=1, st=1, dr=n, m=(n+1)/2, fp, fst, fdr, sol=0;
    while(lefti>m || righti<=m)
    {
        if(lefti>m) st=m+1, p=2*p+1;
        if(righti<=m) dr=m, p=2*p;
        m=(st+dr)/2;
    }
    fst=st;
    fdr=dr;
    fp=p;
    dr=m;
    p=2*p;
    while(st<lefti)
    {
        m=(st+dr)/2;
        if(lefti>m) st=m+1, p=2*p+1;
        else
        {
            sol=max(sol, aint[2*p+1]);
            dr=m;
            p=2*p;
        }
    }
    sol=max(sol, aint[p]);
    st=fst;
    dr=fdr;
    p=fp;
    st=m+1;
    p=2*p+1;
    while(dr>righti)
    {
        m=(st+dr)/2;
        if(righti<=m) dr=m, p=2*p;
        else
        {
            sol=max(sol, aint[2*p]);
            st=m+1;
            p=2*p+1;
        }
    }
    sol=max(sol, aint[p]);
    return sol;
}

int main()
{
    f>>n>>m;
    for(i=1;i<=n;i++) f>>v[i];
    dfs(1,1,n);
    for(i=1;i<=m;i++)
    {
        f>>x>>a>>b;
        if(!x)
        {
            poz=a;
            v[poz]=b;
            update();
        }
        else
        {
            lefti=a;
            righti=b;
            int sol=query();
            g<<sol<<'\n';
        }
    }
    return 0;
}