Cod sursa(job #1161011)

Utilizator misu007Pogonaru Mihai misu007 Data 30 martie 2014 22:48:35
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include <cstdio>
#include <algorithm>
using namespace std;

inline int sl(int x) {return x<<1;}
inline int sr(int x) {return (x<<1)+1;}

const int dim=100000;

int n,m,x,y,maxim,arbore[(dim<<1)-1];

void update(int nod,int st,int dr)
{
    if(st==dr)
    {
        arbore[nod]=y;
    }
    else
    {
        int mij=(st+dr)/2;
        if(x<=mij) update(sl(nod),st,mij);
        else update(sr(nod),mij+1,dr);
        arbore[nod]=max(arbore[sl(nod)],arbore[sr(nod)]);
    }
}

void query(int nod,int st,int dr)
{
    if(x<=st&&dr<=y)
    {
        if(maxim<arbore[nod]) maxim=arbore[nod];
    }
    else
    {
        int mij=(st+dr)/2;
        if(x<=mij) query(sl(nod),st,mij);
        if(mij<y) query(sr(nod),mij+1,dr);
    }
}

void read_construct()
{
    freopen("arbint.in","r",stdin);
    scanf("%d%d",&n,&m);
    for(int i=0;i<n;++i)
    {
        x=i+1;
        scanf("%d",&y);
        update(1,1,n);
    }
}

int main()
{
    read_construct();
    int q;
    while(m)
    {
        --m;
        scanf("%d%d%d",&q,&x,&y);
        if(q)
        {
            update(1,1,n);
        }
        else
        {
            query(1,1,n);
            printf("%d\n",maxim);
            maxim=0;
        }
    }
    return 0;
}