Cod sursa(job #1939231)

Utilizator heracleRadu Muntean heracle Data 25 martie 2017 15:54:11
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <assert.h>


std::ifstream f("arbint.in");
std::ofstream g("arbint.out");

int A[700004], qst, qdr, md, nod=1, rez;

int p2[700000];

int max(const int &a, const int &b)
{
    return a>b?a:b;
}

int query(int nod, int st, int dr)
{
    if(p2[dr-st+1]==0)
    {
        nod++;
        nod--;
    }
    if(qst<=st && dr<=qdr)
        return A[nod];
    else if(qdr<st||dr<qst)
        return 0;
    else
    {
        md=(st+dr)/2;
        return max(query(2*nod, st, md),query(2*nod+1, md+1, dr));
    }
}

void update(int nod, int st, int dr, int poz, int val)
{
    if(p2[dr-st+1]==0)
    {
        nod++;
        nod--;
    }
    if(st==dr)
        A[nod]=val;
    else
    {
        md=(st+dr)/2;
        if(poz<=md)
            update(2*nod, st, md, poz, val);
        else
            update(2*nod+1, md+1, dr, poz, val);
        A[nod]=A[2*nod] > A[2*nod+1] ? A[2*nod] : A[2*nod+1] ;
    }
}

int main()
{
    int N, M, i, put, a, b, op, dr, x;
    f>>N>>M;
    dr=1;
    p2[1]=1;
    for(put=0; dr<N; put++)
    {
        dr=2*dr;
        p2[dr]=1;
    }
    for(i=1; i<=N; i++)
    {
        f>>x;
        update(1, 1, dr, i, x);
    }
    for(i=1; i<=M; i++)
    {
        f>>op>>a>>b;
        if(op==1)
            update(1, 1, dr, a, b);
        else
        {
            rez=0;
            qst=a;
            qdr=b;
            g<<query(1, 1, dr)<<"\n";
        }
    }
    return 0;
}