Cod sursa(job #2723975)

Utilizator AndiAndi39Sabo Andrei Claudiu AndiAndi39 Data 15 martie 2021 23:36:06
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.4 kb
#include<iostream>
#include<fstream>

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

#define nrm 100000
int n,m;
int tree[4*nrm+10];

void add(int node, int left, int right, int val, int pos)
{
    if(left==right)
    {
        tree[node]=val;
        return;
    }
    int mij=(left+right)/2;
    if(pos<=mij)
    {
        add(2*node,left,mij,val,pos);
    }
    else
    {
        add(2*node+1,mij+1,right,val,pos);
    }
    tree[node]=max(tree[2*node],tree[2*node+1]);
}

int query(int node, int left, int right, int intervall, int intervalr)
{
    if(intervall<=left && right<=intervalr)
    {
        return tree[node];
    }
    int mij=(left+right)/2;
    int maxl=0,maxr=0;
    if(mij>=intervall)
    {
        maxl=query(2*node,left,mij,intervall,intervalr);
    }
    if(mij<intervalr)
    {
        maxr=query(2*node+1,mij+1,right,intervall,intervalr);
    }
    return max(maxl,maxr);
}

void read()
{
    fin>>n>>m;
    for(int i=1; i<=n; i++)
    {
        int x;
        fin>>x;
        add(1,1,n,x,i);
    }
    for(int i=1; i<=m; i++)
    {
        int p,a,b;
        fin>>p>>a>>b;
        if(p==0)
        {
            fout<<query(1,1,n,a,b)<<'\n';
        }
        else
        {
            add(1,1,n,b,a);
        }
    }
}

int main ()
{
    read();
    fin.close();
    fout.close();
    return 0;
}