Cod sursa(job #1818137)

Utilizator GrandmasterSoucup Bogdan Grandmaster Data 28 noiembrie 2016 20:55:23
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <fstream>
#include <math.h>
#include <vector>
#include <set>
#include <algorithm>
#include <cstring>
//#include <unordered_map>
#include <iomanip>
#include <time.h>
#include <stdio.h>
#include <bitset>
#include <map>
#define MAX 500000000000
//#include <iostream>
//#include <windows.h>
#include <deque>
using namespace std;
//ifstream cin("jocul.in");
//ofstream cout("jocul.out");
ifstream cin("arbint.in");
ofstream cout("arbint.out");
int n, x[400004], m;
void cons(int n, int x[])
{
    for(int i = n - 1; i > 0; i--)
        x[i] = max(x[i * 2], x[i * 2 + 1]);
}
void add(int poz, int x[], int elem)
{
    poz += n - 1;
    x[poz] = elem;
    while(poz != 1){
        poz /= 2;
        x[poz] = max(x[poz * 2], x[poz * 2 + 1]);
    }
}
int query(int x[], int a, int b)
{
    a += n; b += n;
    int sum = 0;
    while(a < b){
        if(a % 2 != 0)
            sum = max(sum, x[a++]);
        if(b % 2 != 0)
            sum = max(sum, x[--b]);
        a /= 2;
        b /= 2;
    }
    return sum;
}
int main()
{
    cin >> n >> m;
    int copn = n;
    n = ((n & (n - 1)) == 0 ? n : (1<<int(log2(n) + 1)));
    for(int i = 0; i < copn; i++)
        cin >> x[i + n];
    cons(n, x);
    for(int i = 0; i < m; i++)
    {
        int a, b, c;
        cin >> a >> b >> c;
        if(a == 0)
            cout << query(x, b - 1, c) << "\n";
        else{
            add(b, x, c);
        }
    }
    return 0;
}