Cod sursa(job #2550536)

Utilizator Dragono63Stanciu Rares Stefan Dragono63 Data 18 februarie 2020 20:51:58
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.18 kb
#include <bits/stdc++.h>

const int nmax=100004;

using namespace std;

int v[nmax];

int n,m;

int arb[4*nmax];

void update(int st,int dr,int pos,int nod)
{
    if(st==dr) arb[nod]=v[pos];
    else
    {
        int mij=(st+dr)/2;
        if(pos<=mij) update(st,mij,pos,2*nod);
        else update(mij+1,dr,pos,2*nod+1);
        arb[nod]=max(arb[2*nod], arb[2*nod+1]);
    }
}
int query(int st,int dr, int p1,int p2,int nod)
{
    if(st==p1 && dr==p2) return arb[nod];
    else
    {
        int mij=(st+dr)/2;
        if(p2<=mij) return query(st,mij,p1,p2,2*nod);
        else if(p1>mij) return query(mij+1,dr,p1,p2,2*nod+1);
        else{
            return max(query(st,mij,p1,mij,2*nod), query(mij+1,dr,mij+1,p2,2*nod+1));
        }
    }
}
int main()
{
    ifstream f("arbint.in");
    ofstream g("arbint.out");
    int n,m;
    f>>n>>m;
    for(int i=1;i<=n;i++) f>>v[i];
    for(int i=1;i<=n;i++) update(1,n,i,1);
    for(int i=1;i<=m;i++)
    {
        int c,p1,p2;
        f>>c>>p1>>p2;
        if(c==0) g<<query(1,n,p1,p2,1)<<"\n";
        else
        {
            v[p1]=p2;
            update(1,n,p1,1);
        }
    }
    return 0;

}