Cod sursa(job #1894432)

Utilizator BlackNestaAndrei Manaila BlackNesta Data 26 februarie 2017 20:28:32
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <bits/stdc++.h>
#define Nmax 100050

using namespace std;

FILE *fin = fopen("arbint.in", "r");
FILE *fout = fopen("arbint.out", "w");

int Narb, Q, aint[4 * Nmax];

inline void Update(int p, int x)
{
    int t;
    p += Narb - 1;
    aint[p] = x;
    while(p > 0)
    {
        if(p & 1) p--;
        t = p >> 1;
        aint[t] = max(aint[p], aint[p + 1]);
        p = t;
    }
}

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

int main()
{
    int N, Q, i, T, x, y, p;
    fscanf(fin, "%d %d", &N, &Q);
    Narb = 1;
    while(Narb < N)
        Narb *= 2;
    p = Narb;
    for(i = 1; i <= N; i++)
        fscanf(fin, "%d", &aint[p++]);
    for(i = Narb - 1; i > 0; i--)
        aint[i] = max(aint[2 * i], aint[2 * i + 1]);
    while(Q--)
    {
        fscanf(fin, "%d %d %d", &T, &x, &y);
        if(T == 0)
            fprintf(fout, "%d\n", Query(1, x, y, 1, Narb));
        else Update(x, y);
    }
    return 0;
}