Cod sursa(job #2337710)

Utilizator victorv88Veltan Victor victorv88 Data 6 februarie 2019 17:40:21
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.02 kb
#include <iostream>
#include <fstream>
#define MAX_SIZE 100005
#define MAX_VAL (-0x3f3f3f3f)
using namespace std;

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

int n, m, arr_init[MAX_SIZE], tree[MAX_SIZE*4], pos_max;

int create_tree(int st, int dr, int pos)
{
    if (st==dr)
    {
        tree[pos]=arr_init[st];
        if (pos>pos_max)
            pos_max=pos;
        return tree[pos];
    }
    int mij=(st+dr)/2;
    int val_stanga=create_tree(st,mij,pos*2);
    int val_dreapta=create_tree(mij+1,dr,pos*2+1);
    tree[pos]=max(val_dreapta,val_stanga);
    return tree[pos];
}

int cautare_max(int st, int dr, int stanga_query, int dreapta_query, int pos)
{
    if (st>=stanga_query && dr<=dreapta_query)
    {
        return tree[pos];
    }
    if (st<stanga_query && dr<stanga_query || st>dreapta_query && dr>dreapta_query)
    {
        return MAX_VAL;
    }
    int mij=(st+dr)/2;
    int val_st=cautare_max(st,mij,stanga_query,dreapta_query,pos*2);
    int val_dr=cautare_max(mij+1,dr,stanga_query,dreapta_query,pos*2+1);
    return max(val_st,val_dr);
}

int update_tree(int st, int dr, int index_tb_updated, int val, int pos)
{
    if (st==dr)
    {
        tree[pos]=val;
        return tree[pos];
    }
    int mij=(st+dr)/2;
    if (index_tb_updated<=mij)
    {
        tree[pos]=max(tree[pos*2+1],update_tree(st,mij,index_tb_updated,val,pos*2));
        return tree[pos];
    }
    else
    {
        tree[pos]=max(tree[pos*2],update_tree(mij+1,dr,index_tb_updated,val,pos*2+1));
        return tree[pos];
    }
}

int main() {
    int cerinta, termen1, termen2;
    f >> n >> m;
    for (int i=1; i<=n; i++)
    {
        f >> arr_init[i];
        tree[i]=tree[n+i]=tree[2*n+i]=tree[3*n+i]=MAX_VAL;
    }
    create_tree(1,n,1);
    for (int query=0; query<m; query++)
    {
        f >> cerinta >> termen1 >> termen2;
        if (cerinta==0)
        {
            g <<cautare_max(1,n,termen1,termen2, 1) << '\n';
        }
        else if (cerinta==1)
        {
            update_tree(1,n,termen1,termen2,1);
        }
    }
    return 0;
}