Cod sursa(job #1455457)

Utilizator ggokGeri Gokaj ggok Data 28 iunie 2015 00:49:08
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <iostream>
#include <fstream>
using namespace std;
int N,arr[100001],sgt[500001],V,E,op,num1,num2,Q;
inline void buildsgt(int l,int r,int curr)
{
    if(l==r){
        sgt[curr]=arr[r];
        return;
    }
    int mid=l+(r-l)/2;
    buildsgt(l,mid,curr*2);
    buildsgt(mid+1,r,curr*2+1);
    sgt[curr]=max(sgt[curr*2],sgt[curr*2+1]);
}
inline int query(int l,int r,int curr,int x,int y)
{
    if(y<l || x>r )
    return -9999999999999;
    if(l>=x && r<=y)
    return sgt[curr];
    int mid=l+(r-l)/2;
    int sol=query(l,mid,curr*2,x,y);
        int sol2=query(mid+1,r,curr*2+1,x,y);
        return max(sol,sol2);
}
inline void update(int l,int r,int curr,int x,int res)
{
    if(x<l || x>r)
    return;
    if(l==r){
    sgt[curr]=res;
    return;
    }
    int mid=l+(r-l)/2;
    update(l,mid,curr*2,x,res);
    update(mid+1,r,curr*2+1,x,res);
    sgt[curr]=max(sgt[curr*2],sgt[curr*2+1]);
}
int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    cin>>V>>Q;
for(int i=1;i<=V;i++)
    cin>>arr[i];
    //for(int i=1;i<=20;i++)
       // cout<<sgt[i];
buildsgt(1,V,1);
   // for(int i=1;i<=20;i++)
//cout<<sgt[i];
while(Q--)
{
    cin>>op>>num1>>num2;
    if(op==0)
   cout<<query(1,V,1,num1,num2)<<"\n";
   if(op==1)
    update(1,V,1,num1,num2);
}
    return 0;
}