Cod sursa(job #2097635)

Utilizator FunnyStockyMihnea Andreescu FunnyStocky Data 1 ianuarie 2018 00:25:39
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <fstream>
using namespace std;
ifstream cin("arbint.in");
ofstream cout("arbint.out");
const int nm=100000,nm2=2*(131072+100);
int v[nm+5];
int sol[nm2+5];
int n,m;
int p,a,b;
int len;
void build(int st,int dr,int poz)
{
    if(st==dr)
    {
        sol[poz]=v[st];
        return;
    }
    int med=(st+dr)/2;
    build(st,med,2*poz+1);
    build(med+1,dr,2*poz+2);
    sol[poz]=max(sol[2*poz+1],sol[2*poz+2]);
}
int slove(int a,int b,int st,int dr,int poz)
{
    if(a<=st and dr<=b)
        return sol[poz];
    if(dr<a or b<st)
        return -1e9;
    int med=(st+dr)/2;
    return max(slove(a,b,st,med,2*poz+1),slove(a,b,med+1,dr,2*poz+2));
}
void update(int cine,int st,int dr,int poz)
{
    if(st>cine or cine>dr)
        return;
    if(st==dr)
    {
        sol[poz]=v[st];
        return;
    }
    int med=(st+dr)/2;
    update(cine,st,med,2*poz+1);
    update(cine,med+1,dr,2*poz+2);
    sol[poz]=max(sol[2*poz+1],sol[2*poz+2]);
}
int main()
{
    cin>>n>>m;
    for(int i=0;i<n;i++)
        cin>>v[i];
    for(int i=0;i<=nm2;i++)
        sol[i]=-1;
    build(0,n-1,0);
    for(int i=0;i<=nm2;i++)
        if(sol[i]==-1)
        {
            len=i;
            break;
        }
    for(int i=1;i<=m;i++)
    {
        cin>>p>>a>>b;
        if(p==0)
        {
            cout<<slove(a-1,b-1,0,n-1,0)<<"\n";
        }
        else
        {
            v[a-1]=b;
            update(a-1,0,n-1,0);
        }
    }
    return 0;
}
/**
**/