Cod sursa(job #2159104)

Utilizator mrhammerCiocan Cosmin mrhammer Data 10 martie 2018 19:06:29
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.8 kb
#include<iostream>
#include<fstream>
#include<vector>
#define MIN_VAL -100
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
std::vector<int> arr;
std::vector<int> vec;
int maxx;
void update(int x,int y,int pos,int up_pos)
{
    if(x == y)
    {
        arr[pos] = vec[x];
        return;
    }
    int middle = (x+y)/2;
    if(up_pos <= middle) update(x,middle,2*pos+1,up_pos);
    else update(middle+1,y,2*pos+2,up_pos);
    arr[pos] = max(arr[2*pos+1],arr[2*pos+2]);
}
void range_query(int x,int y,int x1,int y1,int pos)
{
    if(x >= x1 && y <= y1)
    {
        if(arr[pos] > maxx) maxx = arr[pos];
        return;
    }
    int middle = (x+y)/2;
    if(x1 <= middle) range_query(x,middle,x1,y1,2*pos+1);
    if(y1 > middle) range_query(middle+1,y,x1,y1,2*pos+2);
    //else return range_query(middle+1,y,x1,y1,2*pos+2);
}
/*int range_query(int x,int y,int pos,int x1,int y1)
{
    if(x >= x1 && y <= y1) return arr[pos];
    if(x > y1 || y < x1) return MIN_VAL;
    return max(range_query(x,(x+y)/2,2*pos+1,x1,y1),range_query(((x+y)/2)+1,y,2*pos+2,x1,y1));
}*/
void print_arr()
{
    for(int i=0;i<arr.size();i++) cout<<arr[i]<<" ";
    cout<<"\n";
}
int n,m;
int main()
{
    fin>>n>>m;
    int k1;
    arr.assign(4*n,0);
    for(int i=0;i<n;i++)
    {
        fin>>k1;
        vec.push_back(k1);
        update(0,n-1,0,vec.size()-1);
    }
    for(int i=0;i<m;i++)
    {
        int k2,k3;
        fin>>k1>>k2>>k3;
        if(k1 == 0)
        {
            maxx = MIN_VAL;
            range_query(0,n-1,k2-1,k3-1,0);
            fout<<maxx<<"\n";
        }
        else if(k1 == 1)
        {
            vec[k2-1] = k3;
            update(0,n-1,0,k2-1);
            //print_arr();
        }
    }
    //cout<<range_query(0,n-1,0,2,0);
}