Cod sursa(job #1530850)

Utilizator feli2felicia iuga feli2 Data 21 noiembrie 2015 12:57:11
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include <iostream>
#include <fstream>

using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");

int a[100005], v[400005], x, y, n, m, mx, i, nr;

void build(int node,int l, int r)
{
    if(l==r)
    {
        v[node]=a[l];
        return;
    }
    int mid=(l+r)/2;
    build(2*node,l,mid);
    build(2*node+1,mid+1,r);
    if(v[2*node]>v[2*node+1])
        v[node]=v[2*node];
    else
        v[node]=v[2*node+1];
}

void update(int node, int l, int r)
{
    if(l==r)
    {
        v[node]=y;
        return;
    }
    int mid=(l+r)/2;
    if(x<=mid)
    {
        update(node*2,l,mid);
    }
    else
    {
        update(node*2+1,mid+1,r);
    }
    if(v[2*node]>v[2*node+1])
        v[node]=v[2*node];
    else
        v[node]=v[2*node+1];
}

void query(int node,int l, int r)
{
    if(x<=l&&y>=r)
    {
        if(v[node]>mx)
            mx=v[node];
        return;
    }
    int mid=(l+r)/2;
    if(x<=mid)
    {
        query(2*node, l, mid);
    }
    if(y>mid)
    {
        query(2*node+1,mid+1,r);
    }
}

int main()
{
    fin>>n>>m;
    for(i=1;i<=n;i++)
    {
        fin>>a[i];
    }
    build(1,1,n);
    for(i=1;i<=m;i++)
    {
        fin>>nr>>x>>y;
        if(nr==1)
        {
            update(1,1,n);
        }
        else
        {
            mx=0;
            query(1,1,n);
            fout<<mx<<'\n';
        }
    }
    return 0;
}