Cod sursa(job #1675889)

Utilizator ciocan_catalinCiocan Catalin - Iulian ciocan_catalin Data 5 aprilie 2016 17:04:25
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int aint[300000],N,M,a[100005];
int Query(int nod, int x, int y, int st, int dr)
{
    int m;
    if(x == st && y == dr) return aint[nod];
    m = (st+dr)>>1;
    if(y <= m) return Query(nod*2,x,y,st,m);
    if(m+1 <= x) return Query(nod*2+1,x,y,m+1,dr);
    return max(Query(nod*2,x,m,st,m),Query(nod*2+1,m+1,y,m+1,dr));
}
void Update(int p, int x)
{
    int t;
    aint[p] = x;
    while(p > 0)
    {
        t = p/2;
        aint[t] = max(aint[t*2],aint[t*2+1]);
        p = t;
    }
}
int main()
{
    int i,k,op,x,y;
    fin>>N>>M;
    for(i = 1; i <= N; i++) fin>>a[i];
    k = 1;
    while(k < N) k*=2;
    for(i = k; i < k+N; i++)
        aint[i] = a[i-k+1];
    for(i = k-1; i > 0; i--)
        aint[i] = max(aint[i*2],aint[i*2+1]);
    N = k;
    for(i = 1; i <= M; i++)
    {
        fin>>op>>x>>y;
        if(op == 0) fout << Query(1,x,y,1,N) << "\n";
        else Update(x+N-1,y);
    }
    return 0;
}