Cod sursa(job #2303525)

Utilizator FunnyStockyMihnea Andreescu FunnyStocky Data 16 decembrie 2018 14:34:12
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.93 kb
#include <cstdio>
#include <iostream>
#include <vector>

using namespace std;

struct st
{
    vector<int>t;
    int n;

   /// st() {}

    void build(int *a,int v,int l,int r)
    {
        if(l==r)
        {
            t[v]=a[l];
        }
        else
        {
            int m=(l+r)>>1;
            build(a,2*v,l,m);
            build(a,2*v+1,m+1,r);
            t[v]=max(t[2*v],t[2*v+1]);
        }
    }

    void build(int *a,int _n)
    {
        n=_n;
        t.resize(4*n);
        build(a,1,1,n);
    }

    void upd(int p,int x,int v,int l,int r)
    {
        if(l==r)
        {
            t[v]=x;
        }
        else
        {
            int m=(l+r)>>1;
            if(p<=m)
            {
                upd(p,x,2*v,l,m);
            }
            else
            {
                upd(p,x,2*v+1,m+1,r);
            }
            t[v]=max(t[2*v],t[2*v+1]);
        }
    }

    void upd(int p,int x)
    {
        upd(p,x,1,1,n);
    }

    int ask(int a,int b,int v,int l,int r)
    {
        if(a>b)
        {
            return -(1<<30);
        }
        if(a==l && b==r)
        {
            return t[v];
        }
        int m=(l+r)>>1;
        int x=ask(a,min(b,m),2*v,l,m);
        int y=ask(max(m+1,a),b,2*v+1,m+1,r);
        return max(x,y);
    }

    int ask(int l,int r)
    {
        return ask(l,r,1,1,n);
    }

};

const int N=100000+5;

int n,q;
int v[N];

int main()
{
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    cin>>n>>q;
    for(int i=1;i<=n;i++)
    {
        cin>>v[i];
    }
    st a;
    a.build(v,n);
    while(q--)
    {
        int t,x,y;
        cin>>t>>x>>y;
        if(t==0)
        {
            cout<<a.ask(x,y)<<"\n";
        }
        else
        {
            a.upd(x,y);
        }
    }
    return 0;
}