Cod sursa(job #2462440)

Utilizator deiubejanAndrei Bejan deiubejan Data 27 septembrie 2019 12:30:14
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.32 kb
#include <bits/stdc++.h>
using namespace std;

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


#define cin fin
#define cout fout
/*
*/


const int NMAX=(2<<19);
int n, m;
int arbore[NMAX];

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

void query(int &maxi, int start, int finish, int nod, int left, int right)
{
    if(start<=left&&right<=finish)
    {
        maxi=max(maxi,arbore[nod]);
        return;
    }
    int mij=(left+right)/2;
    if(start<=mij)
        query(maxi,start,finish,2*nod,left,mij);
    if(mij<finish)
        query(maxi,start,finish,2*nod+1,mij+1,right);
}



int main()
{
    int x, a, b, caz, maxi;
    cin>>n>>m;
    for(int i=1; i<=n; i++)
    {
        cin>>x;
        update(i,1,x,1,n);
    }
    for(int i=1; i<=m; i++)
    {
        cin>>caz>>a>>b;
        if(caz==0)
        {
            maxi=-1;
            query(maxi,a,b,1,1,n);
            cout<<maxi<<"\n";
        }
        else
            update(a,1,b,1,n);
    }


    return 0;
}