Cod sursa(job #1675944)

Utilizator aaron72Armand Ioan Anusca Popa aaron72 Data 5 aprilie 2016 17:27:12
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <bits/stdc++.h>
#define nmax 300000
using namespace std;

int n,m,res;
int a[nmax];

inline void Update(int p,int x)
{
    int t,mx;
    p=n+p-1;a[p]=x;
    while(p>0)
    {
        t=p/2;
        mx=max(a[2*t],a[2*t+1]);
        a[t]=mx;
        p=t;
    }
}

inline int Query(int p,int l,int r,int start,int finish)
{
    int div;
    if(l==start && r==finish)
        return a[p];
    div=(start+finish)>>1;
    if (r<=div) return Query(2*p,l,r,start,div);
    if (l>div) return Query(p*2+1,l,r,div+1,finish);
    return max(Query(2*p,l,div,start,div),Query(p*2+1,div+1,r,div+1,finish));
}

inline void Input()
{
    int i,opt,x,y,k=1;
    ifstream fin("arbint.in");
    ofstream fout("arbint.out");
    fin>>n>>m;
    while(k<n) k*=2;
    for (i=1; i<=n;i++)
    {
        fin>>x;
        a[k+i-1]=x;
    }
    n=k;
    for(i=n-1;i>=1;i--)
        a[i]=max(a[2*i],a[2*i+1]);
    for(i=1;i<=m;i++)
    {
        fin>>opt>>x>>y;
        if(opt==1)
            Update(x,y);
        else
        {
            res=0;
            fout<<Query(1,x,y,1,n)<<"\n";
        }
    }
    fout.close();
}

int main()
{
    Input();
    return 0;
}