Cod sursa(job #2302604)

Utilizator rares_ciocieaRares Andrei Ciociea rares_ciociea Data 14 decembrie 2018 21:09:30
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.39 kb
#include <fstream>

using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
int aint[400001],v[100001],maxx;
void ing(int nod,int st,int dr)
{
    if(st==dr)
    {
        aint[nod]=v[st];
    }
    else
    {
        int mijl=(st+dr)/2;
        ing(2*nod,st,mijl);
        ing(2*nod+1,mijl+1,dr);
        aint[nod]=max(aint[2*nod],aint[2*nod+1]);
    }
}
void update(int nod,int st,int dr,int val,int pos)
{
    if(st==dr)
    {
        aint[nod]=val;
    }
    else
    {
        int mijl=(st+dr)/2;
        if(pos<=mijl)
        update(2*nod,st,mijl,val,pos);
        if(pos>=mijl+1)
        update(2*nod+1,mijl+1,dr,val,pos);
        aint[nod]=max(aint[2*nod],aint[2*nod+1]);
    }
}
void query(int nod,int st,int dr,int a,int b)
{
    if(a<=st && dr<=b)
        maxx=max(aint[nod],maxx);
    else
    {
        int mijl=(st+dr)/2;
       if (a <= mijl)
            query(2*nod,st,mijl,a,b);
        if (b >= mijl + 1)
            query(2*nod+1,mijl+1,dr,a,b);
    }
}
int main()
{
    int n,m,i,j,cer,x,y;
    in>>n>>m;
    for(i=1;i<=n;i++)
    {
        in>>v[i];
    }
    ing(1,1,n);
    for(i=1;i<=m;i++)
    {
        in>>cer>>x>>y;
        if(cer==1)
            update(1,1,n,y,x);
        if(cer==0)
        {
            maxx=-1;
            query(1,1,n,x,y);
            out<<maxx<<'\n';
        }
    }
    return 0;
}