Cod sursa(job #2419297)

Utilizator stefy_razvanBalauca Stefan Razvan stefy_razvan Data 7 mai 2019 22:50:40
Problema Arbori de intervale Scor 0
Compilator cpp-32 Status done
Runda Arhiva educationala Marime 1.77 kb
#include <bits/stdc++.h>

#define debugd(x) printf(#x" = %d\n",x)
#define debugs(x) printf(#x" = %s\n",x)
#define debugc(x) printf(#x" = %c\n",x)
#define tab printf("\t")
#define end printf("\n")

using namespace std;

ifstream fin("arbint.in");
ofstream fout("arbint.out");

#define MAX 300005

int node[MAX];

int n,m,s=1;
int q,a,b;

inline pos_ith_node(int i){return i-s+1;}
inline node_ith_pos(int a){return a+s-1;}

inline int left(int x){return 2*x;}
inline int right(int x){return 2*x+1;}
inline int parent(int x){return x/2;}

update(int pos,int val){
    int i=node_ith_pos(pos);
    int aux=node[i];
    node[i]=val;
    bool ok=1;
    while(i>1){
        if(node[parent(i)]<node[i]) node[parent(i)]=node[i],i=parent(i);
        else
        i=parent(i),node[i]=max(node[left(i)],node[right(i)]);
    }
}

int querry(int l,int r,int ll=1,int rr=s,int nd=1){
    if(l==ll && r==rr) return node[nd];
    int mid=(ll+rr)/2;
    if(mid>=r) return querry(l,r,ll,mid,left(nd));
    if(mid<l) return querry(l,r,mid+1,rr,right(nd));
    return max(querry(l,mid,ll,mid,left(nd)),querry(mid+1,r,mid+1,rr,right(nd)));

}

int main()
{
    fin>>n>>m;
    int nr=n;
    while(nr){nr/=2;s*=2;}
    for(int i=1;i<=n;i++) fin>>node[node_ith_pos(i)];
    for(int i=s-1;i>0;i--) node[i]=max(node[left(i)],node[right(i)]);
    //for(int i=1;i<2*s;i++) cout<<node[i]<<' ';end;
    for(int i=0;i<m;i++){
        fin>>q>>a>>b;
//        debugd(a);
//        debugd(b);
//        debugd(q);
//        end;
        if(q==1) update(a,b);
        if(q==0) fout<<querry(a,b)<<'\n';
//        int j=2;
//        for(int i=1;i<2*s;i++) {cout<<node[i]<<' ';if(i==j-1){end;j=j*2;}} end;
    }
    //for(int i=1;i<2*s;i++) cout<<node[i]<<' ';end;
    return 0;
}