Cod sursa(job #1653943)

Utilizator svlad2Scurtu Vlad svlad2 Data 16 martie 2016 18:26:22
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int N,M;
int tree[400005],v[100005];
int maxim(int a,int b)
{
    if(a>b) return a;
    return b;
}
void update_pos(int node,int st,int dr,int pos,int x)
{
    if(st==dr)
    {
        tree[node]=x;
        return;
    }
    int mij=(st+dr)/2;
    if(pos<=mij) update_pos(node*2,st,mij,pos,x);
    else update_pos(node*2+1,mij+1,dr,pos,x);
    tree[node]=maxim(tree[node*2],tree[node*2+1]);
}
int query(int node,int st,int dr,int a,int b)
{
    if(a<=st&&dr<=b)
    {
        return tree[node];
    }
    int mij=(st+dr)/2,rs=0,rd=0;
    if(a<=mij)
        rs=query(node*2,st,mij,a,b);
    if(mij<b)
        rd=query(node*2+1,mij+1,dr,a,b);
    return maxim(rs,rd);
}
void pune(int node,int st,int dr)
{
    if(st==dr)
    {
        tree[node]=v[st];
        return;
    }
    int maxu=0;
    for(int i=st;i<=dr;i++)
    {
        if(maxu<v[i]) maxu=v[i];
    }
    tree[node]=maxu;
    int mij=(st+dr)/2;
    pune(node*2,st,mij);
    pune(node*2+1,mij+1,dr);
}
int main()
{
    int x,y,z,t;
    f>>N>>M;
    for(int i=1;i<=N;i++)
    {
        f>>v[i];
    }
    pune(1,1,N);
    for(int j=1;j<=M;j++)
    {
        f>>x>>y>>z;
        if(x==0)
        {
            g<<query(1,1,N,y,z)<<endl;
        }
        else
        {
            update_pos(1,1,N,y,z);
        }
    }
    return 0;
}