Cod sursa(job #1188338)

Utilizator RynaquiAxinte Silviu Rynaqui Data 19 mai 2014 13:55:36
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.99 kb
#include <cstdio>
#include <algorithm>
#define N 300000
using namespace std;
int v[N],n,q,zero,M,i,tip,a,b,max_val(int,int,int);
int main()
{
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    //1-2^k-1 noduri interne (2^k-1 = zero )
    //zero+1 - zero+n pozitiile in care memoram val din sir
    scanf("%d%d",&n,&q);
    for(zero=1;zero<n;zero<<=1);M=zero;zero--;

    for(i=1;i<=n;i++)scanf("%d",&v[zero+i]);
    for(i=zero;i>=1;i--)v[i]=max(v[2*i],v[2*i+1]);
    for(;q;q--)
    {
        scanf("%d%d%d",&tip,&a,&b);
        if(tip==0)
            printf("%d\n",max_val(1,1,M));
        else
            {
                a+=zero;
                v[a]=b;
                for(a>>=1;a;a>>=1)
                    v[a]=max(v[2*a],v[2*a+1]);
            }
    }

    return 0;
}
int max_val(int nod,int A,int B)
{
    if(a>B||A>b)return 0;
    if(a<=A&&B<=b)return v[nod];
    int C=(A+B)/2;
    return max(max_val(2*nod,A,C),max_val(2*nod+1,C+1,B));
}