Cod sursa(job #2392732)

Utilizator PaterucAPetruc Andrei Stefan PaterucA Data 30 martie 2019 12:39:18
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.98 kb
#include <bits/stdc++.h>

using namespace std;

ifstream inf("arbint.in");
ofstream outf("arbint.out");

const int N=(1<<18);

int n, q, z;
int ai[N];

void upd(int ,int );
int getMax(int ,int ,int ,int ,int );

int main()
{
    inf>>n>>q;
    for(z=1;z<n; z*=2);
    z--;
    for(int i=1; i<=n; i++)
        inf>>ai[z+i];
    for(int j=z; j>=1; j--)
        ai[j]=max(ai[2*j],ai[2*j+1]);
    for(;q;q--)
    {
        int c, x, y;
        inf>>c>>x>>y;
        if(c==1)
            upd(x,y);
        else
            outf<<getMax(1,1,z+1,x,y)<<'\n';
    }

    return 0;
}

void upd(int poz, int val)
{
    poz+=z;
    ai[poz]=val;
    for(int i=poz/2; i>=1; i/=2)
        ai[i]=max(ai[2*i],ai[2*i+1]);
}

int getMax(int ind, int lo, int hi, int st, int dr)
{
    if(st<=lo&&hi<=dr)
        return ai[ind];
    else if(st>hi||dr<lo)
        return 0;
    return max(getMax(2*ind, lo, (hi+lo)/2,st, dr),getMax(2*ind+1, (lo+hi)/2+1, hi,st, dr));
}