Cod sursa(job #1027233)

Utilizator tudy23Coder Coder tudy23 Data 12 noiembrie 2013 17:05:50
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <cstdio>
#include <algorithm>
using namespace std;
int n,m;
int a_int[500001];
int val,poz;
int maxx;
int inc, sf;
void update(int nod, int st, int dr)
{
    if(st==dr)
        a_int[nod]=val;
    else
    {
        int mij=(st+dr)/2;
        if(poz<=mij)    update(2*nod,st,mij);
        else            update(2*nod+1,mij+1,dr);
    a_int[nod]=max(a_int[2*nod],a_int[2*nod+1]);
    }
}
void qq(int nod, int st, int dr)
{
    if(st>=inc&&dr<=sf)
        maxx=a_int[nod]>maxx?a_int[nod]:maxx;
    else
    {
        int mij=(st+dr)/2;
        if(inc<=mij)        qq(2*nod,st,mij);
        if(mij<sf)         qq(2*nod+1,mij+1,dr);
    }
}
void citire()
{
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    scanf("%d%d",&n,&m);
    int a,b,c;
    for(int i=1; i<=n; ++i)
    {
        scanf("%d",&a);
        poz=i,val=a;
        update(1,1,n);
    }
    for(int i=1; i<=m; ++i)
    {
        scanf("%d%d%d",&a,&b,&c);
        if(a==1)
        {
            val=c;
            poz=b;
            update(1,1,n);
        }
        else
        {
            maxx=-1;
            inc=b;
            sf=c;
            qq(1,1,n);
            printf("%d\n",maxx);
        }
    }
    fclose(stdin);
    fclose(stdout);
}
int main()
{
    citire();
    return 0;
}