Cod sursa(job #1710733)

Utilizator dani_mocanuDani Mocanu dani_mocanu Data 29 mai 2016 18:20:44
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <bits/stdc++.h>

using namespace std;
const int nmax = 100005;
int aint[4*nmax],v[nmax];
int N,M;
ifstream fin("arbint.in");
ofstream fout("arbint.out");

inline void Build(int nod, int st, int dr)
{
    if(st == dr)
    {
        aint[nod] = v[st];
        return;
    }
    int mij = (st+dr)/2;
    Build(2*nod, st, mij);
    Build(2*nod+1, mij+1, dr);
    aint[nod] = max(aint[2*nod],aint[2*nod+1]);
}

inline void Update(int nod, int st, int dr, int p, int x)
{
    if(st == dr)
    {
        aint[nod] = x;
        return;
    }
    int mij = (st + dr)/2;
    if(p <= mij) Update(2*nod, st, mij, p, x);
    else Update(2*nod+1, mij + 1, dr, p, x);
    aint[nod] = max(aint[2*nod],aint[2*nod+1]);
}

inline int Query(int nod, int st, int dr, int x, int y)
{
    if(st ==  x && y == dr) return aint[nod];
    int mij = (st + dr)/2;
    if(y <= mij) return Query(2*nod, st, mij, x, y);
    else if(x > mij) return Query(2*nod+1, mij+1, dr, x, y);
    else return max(Query(2*nod, st, mij, x, mij),Query(2*nod+1, mij+1, dr, mij+1, y));
}

int main()
{
    int i,a,b,c;
    fin>>N>>M;
    for(i = 1; i <= N; ++i) fin>>v[i];
    Build(1,1,N);
    for(i = 1; i <= M; ++i)
    {
        fin>>c>>a>>b;
        if(c == 0) fout<< Query(1, 1, N, a, b) << "\n";
        else Update(1, 1, N, a, b);
    }
    fout.close();
    return 0;
}