Cod sursa(job #1236076)

Utilizator Kira96Denis Mita Kira96 Data 1 octombrie 2014 12:20:33
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include<fstream>
#define N 100100
#define FOR(a,b,c) for(register int a=b;a<=c;++a)
using namespace std;
ifstream f("aint.in");
ofstream g("aint.out");
int H[N<<2],v[N],sol,a,b,tip,n,m;
void upd(int l,int r,int po,int val,int poz)
{
    if(l==r)
    {
        H[po]=val;
        return;
    }
    int m=(l+r)>>1;
    if(poz<=m)
    upd(l,m,po<<1,val,poz);
    else
    upd(m+1,r,(po<<1)+1,val,poz);
    H[po]=max(H[po<<1],H[(po<<1)+1]);
}
void query(int l,int r,int po,int st,int dr)
{
    if(l>=st&&r<=dr)
    {
        sol=max(sol,H[po]);
        return;
    }
    int m=(l+r)>>1;
    if(st<=m)
    query(l,m,po<<1,st,dr);
    if(dr>m)
    query(m+1,r,(po<<1)+1,st,dr);
}
void go(int l,int r,int po)
{
    if(l==r)
    {
        H[po]=v[l];
        return;
    }
    int m=(l+r)>>1;
    go(l,m,po<<1);
    go(m+1,r,(po<<1)+1);
    H[po]=max(H[po<<1],H[(po<<1)+1]);
}
int main ()
{
    f>>n>>m;
    FOR(i,1,n)
    f>>v[i];
    go(1,n,1);
    FOR(i,1,m)
    {
        f>>tip;
        if(tip)
        {
            f>>a>>b;
            upd(1,n,1,b,a);
        }
        else
        {
            sol=0;
            f>>a>>b;
            query(1,n,1,a,b);
            g<<sol<<"\n";
        }
    }
    return 0;
}