Cod sursa(job #1875898)

Utilizator andraSaceliAndra Saceli andraSaceli Data 11 februarie 2017 19:10:27
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
#include<cstdio>
#include<vector>
using namespace std;
class SegmentTree
{
public:
    SegmentTree(int n2)
    {
        n=n2;
        arbint.resize(n2*4);
    }
    void Update(int poz,int val)
    {
        update(1,1,n,poz,val);
    }
    int sol(int a,int b)
    {
        return query(1,1,n,a,b);
    }
private:
    int n;
    vector <int> arbint;
    void update(int nod,int st,int dr,int poz,int val)
    {
        int mij;
        if(st==dr)
        {
            arbint[nod]=val;
            return ;
        }
        mij=(st+dr)>>1;
        if(poz<=mij)
            update(nod<<1,st,mij,poz,val);
        else
            update((nod<<1)+1,mij+1,dr,poz,val);
        arbint[nod]=max(arbint[nod<<1],arbint[(nod<<1)+1]);
    }
    int query(int nod,int st,int dr,int a,int b)
    {
        int maxim=0,mij;
        if(a<=st && dr<=b)
            return arbint[nod];
        mij=(st+dr)>>1;
        if(a<=mij)
            maxim=max(maxim,query(nod<<1,st,mij,a,b));
        if(b>mij)
            maxim=max(maxim,query((nod<<1)+1,mij+1,dr,a,b));
        return maxim;
    }

};
int main()
{
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    int n,m,x,op,a,b;
    scanf("%d%d",&n,&m);
    SegmentTree *A= new SegmentTree(n);
    for(int i=1; i<=n; i++)
    {
        scanf("%d",&x);
        A->Update(i,x);
    }
    for(int i=1; i<=m; i++)
    {
        scanf("%d%d%d",&op,&a,&b);
        if(op==1)
            A->Update(a,b);
        else
            printf("%d\n",A->sol(a,b));
    }
    return 0;
}