Cod sursa(job #1834176)

Utilizator bogdanboboc97Bogdan Boboc bogdanboboc97 Data 24 decembrie 2016 00:49:04
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.73 kb
#include <fstream>
#include <vector>

class SegmentTree{
    private:
        std::vector<int> tree;
        int n;
    public:
        SegmentTree(int n)
        {
            tree=std::vector<int> (4*n+1);
            this->n=n;
        }

        void update(int x,int left,int right,int pos,int val)// the value of the element on position pos becomes val
        {
            if(left==right)
                tree[x]=val;
            else{
                int mid=(left+right)/2;
                if(pos<=mid)
                    update(2*x,left,mid,pos,val);
                if(pos>mid)
                    update(2*x+1,mid+1,right,pos,val);
                tree[x]=std::max(tree[2*x],tree[2*x+1]);
            }
        }

        int get_max(int x,int left,int right,int a, int b)//returns the max value from interval [left,right]
        {
            if(a<=left && b>=right)// [a,b] is in [left,right]
                return tree[x];
            else{
                int mid=(left+right)/2,sol=-999999999;
                if(a<=mid)
                    sol=std::max(sol,get_max(2*x,left,mid,a,b));
                if(b>mid)
                    sol=std::max(sol,get_max(2*x+1,mid+1,right,a,b));
                return sol;
            }
        }
};

int main()
{
    int n,m;
    std::ifstream in("arbint.in");
    in>>n>>m;
    SegmentTree tree(n);
    for(int i=0;i<n;i++)
    {
        int x;
        in>>x;
        tree.update(1,0,n-1,i,x);
    }
    std::ofstream out("arbint.out");
    for(;m;m--)
    {
        int t,a,b;
        in>>t>>a>>b;
        if(t==1)//1 for update
            tree.update(1,0,n-1,a-1,b);
        if(t==0)//0 for query
            out<<tree.get_max(1,0,n-1,a-1,b-1)<<'\n';
    }
    in.close();
    out.close();
    return 0;
}