Cod sursa(job #1348457)

Utilizator muscaTudose Vlad-Adrian musca Data 19 februarie 2015 18:30:24
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.64 kb
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
int n,m,i,j;
int a[100001];
int aint[1000001];
void generate(int curent_node,int st,int dr)
{
    int maximum_value=0,i,med;
    if(st==dr){ aint[curent_node]=a[st]; return ;}
    for(i=st;i<=dr;i++)
    {
        if(maximum_value<a[i])
            maximum_value=a[i];
    }
    aint[curent_node]=maximum_value;
    med=(st+dr)/2;
    generate(2*curent_node,st,med);
    generate(2*curent_node+1,med+1,dr);
}
void update(int curent_node,int st,int dr,int poz,int val)
{
        int med;
        if(st==dr)
        {
            aint[curent_node]=val;
            return ;
        }
        med=(st+dr)/2;
        if(poz<=med) update(2*curent_node,st,med,poz,val);
        else update(2*curent_node+1,med+1,dr,poz,val);
        aint[curent_node]=max(aint[2*curent_node],aint[2*curent_node+1]);
}
int ans;
void query(int curent_node,int st,int dr,int x,int y)
{
        int med;
        if(x<=st&&y>=dr)
        {
            ans=max(ans,aint[curent_node]);
            return ;
        }
        med=(st+dr)/2;
        if(x<=med) query(2*curent_node,st,med,x,y);
        if(y>med) query(2*curent_node+1,med+1,dr,x,y);
}
int main()
{
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    int i;
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
    }
    generate(1,1,n);
    int tip,x,y;
    for(i=1;i<=m;i++)
    {
        scanf("%d%d%d",&tip,&x,&y);
        if(tip==1) update(1,1,n,x,y);
        if(tip==0){ query(1,1,n,x,y); printf("%d\n",ans); ans=0;}
    }
    return 0;
}