Cod sursa(job #1812235)

Utilizator SmitOanea Smit Andrei Smit Data 21 noiembrie 2016 22:05:58
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
#include <bits/stdc++.h>

using namespace std;

int N,n,m;
int a[400003];

int Query(int p,int x,int y,int st,int dr)
{
    int mijl;
    if(x==st && y==dr)
        return a[p];
    mijl=(st+dr)/2;
    if(y<=mijl)
        return Query(2*p,x,y,st,mijl);
    if(x>=mijl+1)
        return Query(2*p+1,x,y,mijl+1,dr);
    return max(Query(2*p,x,mijl,st,mijl),Query(2*p+1,mijl+1,y,mijl+1,dr));
}

void Update(int p,int x)
{
    p=p+N-1;
    a[p]=x;
    while(p>=1)
    {
        p=p/2;
        a[p]=max(a[2*p],a[2*p+1]);
    }
}

void Citire()
{
    int i,op,x,y;
    ifstream fin("arbint.in");
    ofstream fout("arbint.out");
    fin>>n>>m;
    N=1;
    while(N<n)
        N*=2;
    for(i=N;i<N+n;++i)
        fin>>a[i];
    for(i=N-1;i>=1;--i)
        a[i]=max(a[2*i],a[2*i+1]);
    //operatii
    for(i=1;i<=m;++i)
    {
        fin>>op>>x>>y;
        if(op==0)
            fout<<Query(1,x,y,1,N)<<"\n";
        else
            Update(x,y);
    }
    fin.close();
    fout.close();
}

int main()
{
    Citire();
    return 0;
}