Cod sursa(job #1236079)

Utilizator Kira96Denis Mita Kira96 Data 1 octombrie 2014 12:36:04
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include<fstream>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int x,a,b,n,m,i,M,v[1<<18],OK,t,j,ind,poz;
int ma(int a,int b)
{
    if(a>b)
    return a;
    return b;
}
void update(int st,int dr,int nr)
{
    int m=(st+dr)>>1;
    v[nr]=ma(v[nr],x);
    if(st==dr)
    return ;
    if(j<=m)
    update(st,m,nr<<1);
    else
    update(m+1,dr,(nr<<1)+1);
}
void find(int st,int dr,int nr)
{
    if(st>=a&&dr<=b)
    M=ma(v[nr],M);
    else
    if(st!=dr)
    {
        int m=(st+dr)>>1;
        if(a<=m)
        find(st,m,(nr<<1));
        if(b>m)
        find(m+1,dr,(nr<<1)+1);
    }
}
void goup(int p)
{
    while(p)
    {
    v[p]=ma(v[2*p],v[2*p+1]);
    p>>=1;
    }
}
int div(int st,int dr,int nr)
{
    if(st==dr)
    poz=nr;
    else
    if(!poz)
    {
        int m=(st+dr)>>1;
        if(a>m)
        div(m+1,dr,nr*2+1);
        else
        div(st,m,nr*2);
    }
}

int main ()
{

    f>>n>>m;
    for(j=1;j<=n;++j)
    {
        if(j==40949)
        j=j;
        f>>x;
        update(1,n,1);
    }
    for(i=1;i<=m;++i)
    {
        poz=0;
        M=0;
        f>>t>>a>>b;

        if(!t)
        find(1,n,1);
        else
        {
        div(1,n,1);
        v[poz]=b;
        goup(poz>>1);
        }
        if(!t)
        g<<M<<"\n";
    }
    return 0;
}