Cod sursa(job #2408800)

Utilizator xXoctavianXxStanescu Matei Octavian xXoctavianXx Data 18 aprilie 2019 12:50:44
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.26 kb
#include <bits/stdc++.h>
using namespace std;

ifstream fin("arbint.in");
ofstream fout("arbint.out");

int n,m;
int x;
int arbore[400004]={};

void update(int st, int dr, int nr, int nod, int poz)
{
    int mij=(st+dr)/2;
    if(st>poz || dr<poz)
    {
        return;
    }
    if(st==dr)
    {
        arbore[nod]=nr;
        return;
    }
    update(st,mij,nr,2*nod,poz);
    update(mij+1,dr,nr,2*nod+1,poz);
    arbore[nod]=max(arbore[2*nod],arbore[2*nod+1]);
}

int query(int a, int b, int st, int dr, int nod)
{
    int mij=(st+dr)/2;
    if(a==st && b==dr)
    {
        //cout<<"nod="<<nod<<"\n";
        return arbore[nod];
    }
    if(b<=mij)
    {
        return query(a,b,st,mij,nod*2);
    }
    else if(a>mij)
    {
        return query(a,b,mij+1,dr,nod*2+1);
    }
    else
    {
        return max(query(a,mij,st,mij,nod*2),query(mij+1,b,mij+1,dr,nod*2+1));
    }
}

int main()
{
    fin>>n>>m;
    for(int i=1; i<=n; i++)
    {
        fin>>x;
        update(1,n,x,1,i);
    }
    int o,a,b;
    for(int i=1; i<=m; i++)
    {
        fin>>o>>a>>b;
        if(o==1)
        {
            update(1,n,b,1,a);
        }
        if(o==0)
        {
            fout<<query(a,b,1,n,1)<<"\n";
        }
    }
}