Cod sursa(job #2729764)

Utilizator AlexMariMarinescu Alexandru AlexMari Data 25 martie 2021 11:54:35
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.39 kb
#include<bits/stdc++.h>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");

int n,m;



struct Aint
{
    int v[400005];
    void update(int nod,int poz,int st,int dr,int val)
    {
        if(st==dr)
        {
            v[nod]=val;
            return;
        }
        int mijl=(st+dr)/2;
        if(poz<=mijl)
            update(2*nod,poz,st,mijl,val);
        else
            update(2*nod+1,poz,mijl+1,dr,val);
        v[nod]=max(v[2*nod],v[2*nod+1]);
    }
    int query(int nod,int query_st,int query_dr,int st,int dr)
    {
        if(dr<query_st||st>query_dr)
            return 0;
        if(st>=query_st&&dr<=query_dr)
            return v[nod];
        int mijl=(st+dr)/2;
        if(query_dr<=mijl)
            return query(2*nod,query_st,query_dr,st,mijl);
        else if(query_st>=mijl+1)
            return query(2*nod+1,query_st,query_dr,mijl+1,dr);
        return max(query(2*nod,query_st,query_dr,st,mijl),query(2*nod+1,query_st,query_dr,mijl+1,dr));
    }
} aint;

int main()
{
    fin>>n>>m;
    for(int i=1; i<=n; i++)
    {
        int x;
        fin>>x;
        aint.update(1,i,1,n,x);
    }
    for(int i=1; i<=m; i++)
    {
        int op,x,y;
        fin>>op>>x>>y;
        if(op==0)
            fout<<aint.query(1,x,y,1,n)<<'\n';
        else
            aint.update(1,x,1,n,y);
    }
    return 0;
}