Cod sursa(job #1396990)

Utilizator danalex97Dan H Alexandru danalex97 Data 23 martie 2015 10:43:33
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <fstream>
#include <iostream>
using namespace std;

ifstream F("arbint.in");
ofstream G("arbint.out");

const int N = 100010;

struct aint {
    int a[N<<2],n;

    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.n = n*4;
    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';
    }
}