Cod sursa(job #2029673)

Utilizator TudoseSanzianaTudose Sanziana TudoseSanziana Data 30 septembrie 2017 12:38:38
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
#include <fstream>
using namespace std;

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

int n,m;
int v[100005],aint[400005];

int query(int st, int dr, int a, int b, int node)
{
    if(st==a && dr==b)
        return aint[node];

    int med=(st+dr)/2;

    int maxst=0,maxdr=0;
    if(a<=med) maxst=query(st,med,a,min(med,b),node*2);
    if(b>med) maxdr=query(med+1,dr,max(med+1,a),b,node*2+1);

    return max(maxst,maxdr);
}

void update(int st, int dr, int node, int poz, int val)
{

    if(st==dr)
    {
        aint[node]=v[poz]=val;
        return;
    }

    int med=(st+dr)/2;
    if(poz<=med) update(st,med,node*2,poz,val);
    else update(med+1,dr,node*2+1,poz,val);

    aint[node]=max(aint[node*2],aint[node*2+1]);
}

int main()
{
    in>>n>>m;
    for(int i=1; i<=n; i++)
        {
            in>>v[i];
            update(1,n,1,i,v[i]);
        }

    int t,a,b;
    while(m--)
    {
        in>>t>>a>>b;
        if(t==0) out<<query(1,n,a,b,1)<<'\n';
        else update(1,n,1,a,b);
    }

    return 0;
}