Mai intai trebuie sa te autentifici.

Cod sursa(job #1789519)

Utilizator bogdanboboc97Bogdan Boboc bogdanboboc97 Data 27 octombrie 2016 08:26:40
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include <bits/stdc++.h>
#define mp make_pair
#define pb push_back
#define INF numeric_limits<int>::max()
#define int64 long long
#define lsb(x) (-x)&(x)
using namespace std;
class SegmentTree{
    vector<int> tree;
    int n;
public:
    SegmentTree(int dim)
    {
        n=dim;
        tree=vector<int> (4*dim+1);
    }
    void update(int pos,int val,int x,int left,int right)
    {
        if(left==right)
            tree[x]=val;
        else{
            int mid=(left+right)/2;
            if(pos<=mid)
                update(val,pos,2*x,left,mid);
            else
                update(val,pos,2*x+1,mid+1,right);
            tree[x]=max(tree[2*x],tree[2*x+1]);
        }
    }
    int get_max(int a,int b,int x,int left,int right)
    {
        if(a>=left && right<=b)
            return tree[x];
        else{
            int mid=(left+right)/2,mx=-INF;
            if(a<=mid)
                mx=max(mx,get_max(a,b,2*x,left,mid));
            if(b>mid)
                mx=max(mx,get_max(a,b,2*x+1,mid+1,right));
            return mx;
        }
    }
};
int main()
{
    ifstream in("arbint.in");
    ofstream out("arbint.out");
    int n,m;
    in>>n>>m;
    SegmentTree T(n);
    for(int i=1;i<=n;i++)
    {
        int x;
        in>>x;
        T.update(i,x,1,1,n);
    }
    for(;m;m--)
    {
        int t;
        in>>t;
        if(t==1)
        {
            int pos,val;
            in>>pos>>val;
            T.update(pos,val,1,1,n);
        }
        else{
            int a,b;
            in>>a>>b;
            out<<T.get_max(a,b,1,1,n)<<'\n';
        }
    }
    return 0;
}