Cod sursa(job #1852490)

Utilizator ZanoxNonea Victor Zanox Data 20 ianuarie 2017 20:47:02
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 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];
    if(a==b-1)return max(v[0][a],v[0][b]);
    int i,p;
    for(i=1,p=2;p<b-a+1;p*=2,i++);
    i--;p/=2;
    int c=a/p*p;
    if(c<a)c+=p;
    return max(ret(a,c-1),max(v[i][c/p],ret(c+p,b)));
}

int main()
{
    f>>n>>m;
    for(i=0;i<n;i++)
    {
        f>>v[0][i];
        for(j=1,p=2;p<=n-i;j++,p*=2)
            v[j][i/p]=max(v[j-1][i/(p/2)],v[j-1][i/(p/2)+(i/(p/2)%2==0)-i/(p/2)%2]);
    }
    for(i=0;i<m;i++)
    {
        f>>q>>a>>b;
        if(q==1)
        {
            v[0][a-1]=b;
            for(j=1,p=2;p<=n-a-1;j++,p*=2)
                v[j][(a-1)/p]=max(v[j-1][(a-1)/(p/2)],v[j-1][(a-1)/(p/2)+((a-1)/(p/2)%2==0)-(a-1)/(p/2)%2]);
        }
        if(q==0)
        {
            g<<ret(a-1,b-1)<<'\n';
        }
    }
}