Cod sursa(job #1776657)

Utilizator liviu23Liviu Andrei liviu23 Data 11 octombrie 2016 18:21:15
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <fstream>
#define DIM 100002
using namespace std;

int n,m,v[DIM],segm[5*DIM];

void build(int node,int x,int y) {
    if(x==y) {
        segm[node]=v[x];
        return;
    }
    int mid=(x+y)/2;
    build(2*node,x,mid);
    build(2*node+1,mid+1,y);
    segm[node]=max(segm[2*node],segm[2*node+1]);
}

void update(int node,int x,int y,int a) {
    if(x==y) {
        segm[node]=v[a];
        return;
    }
    int mid=(x+y)/2;
    if(a<=mid)
        update(2*node,x,mid,a);
    else
        update(2*node+1,mid+1,y,a);
    segm[node]=max(segm[2*node],segm[2*node+1]);
}

int query(int node,int x,int y,int a,int b) {
    if(x>=a&&y<=b)
        return segm[node];
    int mid=(x+y)/2,sol=-1;
    if(a<=mid)
        sol=query(2*node,x,mid,a,b);
    if(b>mid)
        sol=max(sol,query(2*node+1,mid+1,y,a,b));
    return sol;
}

int main()
{
    ifstream fin("arbint.in");
    ofstream fout("arbint.out");
    fin>>n>>m;
    for(int i=1;i<=n;i++)
        fin>>v[i];
    build(1,1,n);
    int a,b,c;
    for(int i=1;i<=m;i++) {
        fin>>a>>b>>c;
        if(a==0) {
            fout<<query(1,1,n,b,c)<<'\n';
        }
        else {
            v[b]=c;
            update(1,1,n,b);
        }
    }
    return 0;
}