Cod sursa(job #1256110)

Utilizator mihail.jianuJianu Mihail mihail.jianu Data 5 noiembrie 2014 20:07:27
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=100000;
int val,pos,left,right;
int n;
class Adi{
    public:
        int v[4*N+1];
        void update(int p,int vv){
            pos=p;
            val=vv;
            my_update(1,1,n);
        }
        int query(int l,int r){
            left=l;
            right=r;
            return my_query(1,1,n);
        }
    private:
        int my_query(int p,int l,int r){
            int m=(l+r)/2;
            if(left<=l&&r<=right)
                return v[p];
            if(r<left||right<l)
                return -1;
            return max(my_query(p*2,l,m),my_query(p*2+1,m+1,r));
        }
        void my_update(int p,int l,int r){
            int m=(l+r)/2;
            if(l==r){
                v[p]=val;
                return;
            }
            if(pos<=m)
                my_update(p*2,l,m);
            else
                my_update(p*2+1,m+1,r);
            my_merge(p);
        }
        void my_merge(int p){
            v[p]=max(v[p*2],v[p*2+1]);
        }
};
Adi t;
int main(){
    int q;
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    scanf("%d%d",&n,&q);
    for(int i=1;i<=n;i++){
        int x;
        scanf("%d",&x);
        t.update(i,x);
    }
    while(q){
        q--;
        int x,y,z;
        scanf("%d%d%d",&x,&y,&z);
        if(x==0)
            printf("%d\n",t.query(y,z));
        else
            t.update(y,z);
    }
    return 0;
}