Cod sursa(job #2289237)

Utilizator cosceexcosceex cosceex Data 24 noiembrie 2018 12:02:22
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.38 kb
#include <bits/stdc++.h>
#define nMax 100005
using namespace std;

ifstream f("arbint.in");
ofstream g("arbint.out");
int v[nMax],A[4*nMax],n,m;
int poz,start,stop;
void build(int l,int r,int node)
{
    if(l==r)
        A[node]=v[l];
    else
    {
        int mid=(l+r)/2;
        build(l,mid,2*node);
        build(mid+1,r,2*node+1);
        A[node]=max(A[2*node],A[2*node+1]);
    }
}
void update(int l,int r,int node)
{
    if(l==r)
        A[node]=v[l];
    else
    {
        int mid=(l+r)/2;
        if(poz<=mid) update(l,mid,2*node);
        else update(mid+1,r,2*node+1);
        A[node]=max(A[2*node],A[2*node+1]);
    }
}

int query(int l,int r,int node)
{
    if(start<=l and stop>=r)
        return A[node];
    else
    {
        int mid=(l+r)/2;
        int max1=INT_MIN,max2=INT_MIN;
        if(start<=mid)
            max1=query(l,mid,2*node);
        if(mid+1<=stop)
            max2=query(mid+1,r,2*node+1);
        return max(max1,max2);
    }
}
int main()
{
    f>>n>>m;
    for(int i=1;i<=n;i++)
        f>>v[i];
    build(1,n,1);
    int op,x,y;
    for(int i=1;i<=m;i++){
        f>>op>>x>>y;
        if(op==0){
            start=x;
            stop=y;
            g<<query(1,n,1)<<'\n';
        }
        else
        {
            v[x]=y;
            poz=x;
            update(1,n,1);
        }
    }
    return 0;
}