Cod sursa(job #1849523)

Utilizator MithrilBratu Andrei Mithril Data 17 ianuarie 2017 17:26:37
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda gym_emag_avansati_2016 Marime 1.49 kb
#include <bits/stdc++.h>
#define nmax 100010
 
using namespace std;
 
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int aint[4*nmax],n,m;
 
void build(int,int,int);
void update(int,int,int,int,int);
int query(int,int,int,int,int);
 
int main()
{
    fin>>n>>m;
 
    build(1,1,n);
 
    int i,a,b,tip;
 
    for(i=1;i<=m;++i)
    {
        fin>>tip>>a>>b;
 
        if(tip==0) fout<<query(1,1,n,a,b)<<'\n';
        if(tip==1) update(1,1,n,a,b);
    }
 
    return 0;
}
 
void build(int nod,int st,int dr)
{
    if(st==dr)///sunt in frunza
    {
        fin>>aint[nod];
        return;
    }
 
    int left=nod<<1;
    int right=nod<<1|1;
    int mid=(st+dr)>>1;
 
    build(left,st,mid);
    build(right,mid+1,dr);
 
    aint[nod]=max(aint[left],aint[right]);
}
 
void update(int nod,int st,int dr,int pos,int val)
{
    if(st==dr)
    {
        aint[nod]=val;
        return;
    }
 
    int left=nod<<1,right=nod<<1|1,mid=(st+dr)>>1;
 
    if(pos<=mid)
        update(left,st,mid,pos,val);
    else
        update(right,mid+1,dr,pos,val);
 
    aint[nod]=max(aint[left],aint[right]);
}
 
int query(int nod,int st,int dr,int x,int y)
{
    if(x<=st && dr<=y) return aint[nod];
    int left=nod<<1,right=nod<<1|1,mid=(st+dr)>>1;
 
    if(y<=mid)
        return query(left,st,mid,x,y);
    else if(x>mid)
        return query(right,mid+1,dr,x,y);
        else
            return max(query(left,st,mid,x,y),query(right,mid+1,dr,x,y));
}