Cod sursa(job #2365149)

Utilizator DovlecelBostan Andrei Dovlecel Data 4 martie 2019 12:14:59
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.24 kb
#include <fstream>

using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
const int N=1<<17;
const int INF=1<<30;
int n,m,v[N],aint[2*N];

void update(int poz,int val)
{
    poz=n+poz-1;
    aint[poz]=val;
    while(poz>1)
    {
        poz=poz/2;
        aint[poz]=max(aint[2*poz],aint[2*poz+1]);
    }
}

int query(int ind,int stq,int drq,int sti,int dri)
{
    if(sti>=stq && dri<=drq)
        return aint[ind];
    else
    {
        int m=(sti+dri)/2;
        if(stq<=m && drq>m)
            return max(query(2*ind,stq,drq,sti,m),query(2*ind+1,stq,drq,m+1,dri));
        else if(stq<=m)
            return query(2*ind,stq,drq,sti,m);
        else
            return query(2*ind+1,stq,drq,m+1,dri);
    }
}

int main()
{
    in>>n>>m;
    int t,y,x=0;
    while((1<<x)<n)
        x++;
    for(int i=1;i<=n;i++)
        in>>v[i];
    for(int i=n+1;i<=(1<<x);i++)
        v[i]=-INF;
    n=1<<x;
    for(int i=n;i<2*n;i++)
        aint[i]=v[n-i+1];
    for(int i=n-1;i>=1;i--)
        aint[i]=max(aint[2*i],aint[2*i+1]);
    for(int i=1;i<=m;i++)
    {
        in>>t>>x>>y;
        if(t==0)
            out<<query(1,x,y,1,n);
        else
            update(x,y);
    }
    return 0;
}