Cod sursa(job #2350138)

Utilizator alex2kamebossPuscasu Alexandru alex2kameboss Data 21 februarie 2019 09:02:17
Problema Arbori de intervale Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.19 kb
#include <iostream>
#include <cstdio>

using namespace std;

int dp[300005];
int a[100005];
int n,m,x,y,c;

int update(int st, int dr, int poz, int niv){
    if(st==dr){
        return dp[niv]=a[poz];
    }
    int mij=(st+dr)/2;
    if(poz>mij)
        return dp[niv]=max(dp[2*niv], update(mij+1,dr,poz,2*niv+1));
    return dp[niv]=max(dp[2*niv+1], update(st, mij,poz,2*niv));

}

int caut(int st, int dr, int niv){
    if(x<=st && dr<=y)
        return dp[niv];
    int mij = (st+dr)/2;
    int r1 = -1, r2 = -1;
    if(x<=mij)
        r1=caut(st,mij,2*niv);
    if(mij+1<=y)
        r2=caut(mij+1,dr,2*niv+1);
    //int ret = max(caut(st,mij,2*niv), caut(mij+1,dr,2*niv+1));
    //cout<<st<<" "<<dr<<" "<<ret<<"\n";
    return max(r1, r2);
}

int main()
{
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);

    cin>>n>>m;
    for(int i=0;i<n;++i){
        cin>>a[i];
        update(0,n-1,i,1);
    }
    /*
    for(int i=1;i<10;++i)
        cout<<dp[i]<<" ";
    cout<<"\n";
    */

    for(int i=0;i<m;++i){
        cin>>c>>x>>y;
        if(c==0){
            --x, --y, cout<<caut(0,n-1,1)<<"\n";
        }
        else
            a[x-1]=y, update(0,n-1,x-1,1);
    }

    return 0;
}