Cod sursa(job #1852525)

Utilizator ZanoxNonea Victor Zanox Data 20 ianuarie 2017 21:15:26
Problema Arbori de intervale Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.89 kb
#include <fstream>
#include <iostream>
#include <cstring>

using namespace std;

fstream f("arbint.in",ios::in),g("arbint.out",ios::out);

int n,m,v[18][100000],i,j,p,q,a,b;

int ret(int a, int b)
{
    if(b<a)return 0;
    if(a==b)return v[0][a];
    int i,p,c;
    for(i=0,p=1;p*2<b-a+1;p*=2,i++);
    c=a/p*p;
    if(c<a)c+=p;
    return max(ret(a,c-1),max(v[i][c/p],ret(c+p,b)));
}

void up(int l,int i)
{
    if(i%2==0)v[l][i/2]=max(v[l-1][i],v[l-1][i+1]);
    else v[l][i/2]=max(v[l-1][i],v[l-1][i-1]);
    if(l<17) up(l+1,i/2);
}

int main()
{
    f>>n>>m;
    for(i=0;i<n;i++)
    {
        f>>v[0][i];
        up(1,i);
    }
    for(i=0;i<m;i++)
    {
        f>>q>>a>>b;
        if(q==1)
        {
            a--;
            v[0][a]=b;
            up(1,a);
        }
        if(q==0)
        {
            g<<ret(a-1,b-1)<<'\n';
        }
    }
}