Cod sursa(job #1888412)

Utilizator alexionpopescuPopescu Ion Alexandru alexionpopescu Data 22 februarie 2017 09:11:50
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int n,m,A[271000],p[100001],v[100001];
void build(int k,int a,int b){
    if(a==b)
        A[k]=v[a],p[a]=k;
    else
    {
        int m=(a+b)/2;
        build(k*2,a,m);
        build((k*2)+1,m+1,b);
        A[k]=max(A[k*2],A[(k*2)+1]);
    }
}
int query(int k,int x,int y,int a,int b){
    if (a<=x && y<=b)
        return A[k];
    else{
        int m=(x+y)>>1,w=-1;
        if (a<=m)
            w=max(w,query(k<<1,x,m,a,b));
        if (b>m)
            w=max(w,query((k<<1)+1,m+1,y,a,b));
        return w;
    }
}
void update(int k){
    A[k]=max(A[k*2],A[(k*2)+1]);
    if (k!=1)
        update(k/2);
}
int main(){
    int a,b,i,t;
    fin>>n>>m;
    for(i=1;i<=n;i++)
        fin>>v[i];
    build(1,1,n);
    for(i=1;i<=m;i++){
        fin>>t>>a>>b;
        if(!t)
            fout<<query(1,1,n,a,b)<<'\n';
        else{
            v[a]=b;
            A[p[a]]=b;
            update(p[a]/2);
        }
    }
    fin.close();
    fout.close();
    return 0;
}