Cod sursa(job #1165469)

Utilizator andreiiiiPopa Andrei andreiiii Data 2 aprilie 2014 18:34:54
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include <algorithm>
#include <cstdio>
#include <vector>

using namespace std;

const int N=100005;

class SegmentTree{
public:
    SegmentTree(const int _n=0):
        n(_n),
        aint(vector<int>(5*_n, 0)){}
    void update(const int poz, const int val)
    {
        X=poz;
        Y=val;
        Update(1, 1, n);
    }
    int query(const int st, const int dr)
    {
        X=st;
        Y=dr;
        ret=0;
        Query(1, 1, n);
        return ret;
    }
private:
    int n, X, Y, ret;
    vector <int> aint;
    void Update(int nod, int l, int r)
    {
        if(l==r)
        {
            aint[nod]=Y;
            return;
        }
        int mid=(l+r)/2;
        if(X<=mid) Update(2*nod, l, mid);
        else Update(2*nod+1, mid+1, r);
        aint[nod]=max(aint[2*nod], aint[2*nod+1]);
    }
    void Query(int nod, int l, int r)
    {
        if(X<=l&&r<=Y)
        {
            ret=max(ret, aint[nod]);
            return;
        }
        int mid=(l+r)/2;
        if(X<=mid) Query(2*nod, l, mid);
        if(Y>mid) Query(2*nod+1, mid+1, r);
    }
};

SegmentTree a;

int main()
{
    freopen("arbint.in", "r", stdin);
    freopen("arbint.out", "w", stdout);
    int n, q, i, x, y;
    scanf("%d%d", &n, &q);
    a=SegmentTree(n);
    for(i=1;i<=n;i++)
    {
        scanf("%d", &x);
        a.update(i, x);
    }
    while(q--)
    {
        scanf("%d%d%d", &i, &x, &y);
        if(i) a.update(x, y);
        else printf("%d\n", a.query(x, y));
    }
}