Cod sursa(job #1530761)

Utilizator beatrice01Ferco Beatrice beatrice01 Data 21 noiembrie 2015 12:48:56
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <fstream>

using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
//v[4N] sau v[2^i] i-cea mai mica putere a lui 2 a i 2^i>n
int v[400001],n,m,a[100001],poz,val,x,y;
void build(int node,int left,int right)//[left,right]
{   if(left==right)
        {v[node]=a[left];
        return;
        }

    int middle=(left+right)/2;
    build(2*node,left,middle);
    build(2*node+1,middle+1,right);
    v[node]=max(v[2*node],v[2*node+1]);}
//update x,y a[x]=y;
void update(int node,int left,int right,int poz,int val){
    if(left==right)
        {v[node]=val;
        return;}
    int middle=(left+right)/2;
    if(poz<=middle)
        update(2*node,left,middle,poz,val);
    else
        update(2*node+1,middle+1,right,poz,val);
    v[node]=max(v[2*node],v[2*node+1]);}
//query x,y ->max(x,y)
int MAX=0;
void query(int node,int left,int right,int x,int y){
    if(left>=x&&right<=y)
        {MAX=max(MAX,v[node]);
        return;}
    int middle=(left+right)/2;
    if(x<=middle)
        query(2*node,left,middle,x,y);//merg pe fiul stang
    if(y>middle)
        query(2*node+1,middle+1,right,x,y);//merg pe fiul drept
}
int main(){

    int i,op;
    fin>>n>>m;
    for(i=1;i<=n;i++)
        fin>>a[i];
    build(1,1,n);
    for(i=1;i<=m;i++)
        {fin>>op>>x>>y;
        if(op==1)
            update(1,1,n,x,y);
        else
            {MAX=0;
            query(1,1,n,x,y);
            fout<<MAX<<"\n";}}


    return 0;
}