Cod sursa(job #1634505)

Utilizator japjappedulapPotra Vlad japjappedulap Data 6 martie 2016 14:01:37
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include <fstream>
#include <vector>
using namespace std;

ifstream is ("arbint.in");
ofstream os ("arbint.out");

int N, M;


class SegmentTree{
    int S;
    vector <int> Tree;
public:
    SegmentTree(vector <int> ini)
    {
        for (S = 1; S < ini.size(); S <<= 1);

        Tree = vector<int> (2*S, 0);

        for (int i = 0; i < ini.size(); ++i)
            Tree[i+S] = ini[i];
        for (int i = S-1; i > 0; --i)
            Tree[i] = max(Tree[2*i], Tree[2*i+1]);

    }
    void Update(int pos, int val)
    {
        pos--; pos += S;
        Tree[pos] = val;
        for (pos >>= 1; pos > 0; pos >>= 1)
            Tree[pos] = max(Tree[2*pos], Tree[2*pos+1]);
    }
    int Query(int L, int R)
    {
        int result = 0;
        L--, R--;
        L += S; R += S;
        while (L <= R)
        {
            result = max(result, max(Tree[L], Tree[R]));
            L = (L+1) / 2;
            R = (R-1) / 2;
        }
        return result;
    }
};


int main()
{
    is >> N >> M;
    vector <int> Sir = vector<int>(N);

    for (int i = 0; i < N; ++i)
        is >> Sir[i];

    SegmentTree ST(Sir);

    for (int op, x, y; M; --M)
    {
        is >> op >> x >> y;
        if (op == 1)
            ST.Update(x, y);
        else
            os << ST.Query(x, y) << '\n';
    }

    is.close();
    os.close();
}