Cod sursa(job #1490398)

Utilizator danalex97Dan H Alexandru danalex97 Data 23 septembrie 2015 14:03:05
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include <fstream>
#include <iostream>
#include <vector>
using namespace std;
 
ifstream F("arbint.in");
ofstream G("arbint.out");
 
const int N = 100010;
 
struct aint {
    vector<int> a;
    int n;
 
    void init(int n)
    {
        this->n = n;
        a.resize(n*4+5);
    }
 
    void _update(int n,int l,int r,int p,int v)
    {
        if ( l == r )
        {
            a[n] = v;
            return;
        }
 
        int m = (l + r) / 2;
        if ( p <= m )
            _update(n*2,l,m,p,v);
        else
            _update(n*2+1,m+1,r,p,v);
        a[n] = max(a[n*2],a[n*2+1]);
    }
 
    int _query(int n,int l,int r,int il,int ir)
    {
        if ( l > ir || r < il ) return 0;
        if ( il <= l && r <= ir ) return a[n];
 
        int m = (l + r) / 2;
        return max(_query(n*2,l,m,il,ir),_query(n*2+1,m+1,r,il,ir));
    }
 
    void update(int p,int v)
    {
        _update(1,1,n,p,v);
    }
 
    int query(int l,int r)
    {
        return _query(1,1,n,l,r);
    }
};
 
int n,m;
aint a;
 
int main()
{
    F>>n>>m;
    a.init(n);
    for (int i=1,x;i<=n;++i)
    {
        F>>x;
        a.update(i,x);
    }
    for (int i=1,t,x,y;i<=m;++i)
    {
        F>>t>>x>>y;
        if ( t == 1 )
            a.update(x,y);
        else
            G<<a.query(x,y)<<'\n';
    }
}