Cod sursa(job #1508842)

Utilizator NacuCristianCristian Nacu NacuCristian Data 23 octombrie 2015 00:54:31
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#include <iostream>
#include <stdio.h>

using namespace std;

int n,m;
int arbore[500040];
int x[100010];

void citire()
{
    freopen("arbint.in","r",stdin);
    scanf("%d %d",&n,&m);
    for(int i=0; i<n; i++)
        scanf("%d",&x[i]);

}

int creare_arbore(int st, int dr,int k)
{
    if(st==dr)
        return arbore[k]=x[st];
    int mij=(st+dr)/2;
    return arbore[k]=max(creare_arbore(st,mij,k*2),creare_arbore(mij+1,dr,k*2+1));
}

int a,b;

int update(int st, int dr, int k)
{
    if(st==dr && st==a)
        return arbore[k]=b;
    int mij=(st+dr)/2;
    if(a<=mij)
    {
        update(st,mij,k*2);
        return arbore[k]=max(arbore[2*k],arbore[2*k+1]);
    }
    update(mij+1,dr,k*2+1);
    return arbore[k]=max(arbore[2*k],arbore[2*k+1]);

}
int ma=-1;
void srch(int st, int dr, int k)
{
    if(st>=a && b>=dr)
    {
        if(arbore[k]>ma)
            ma=arbore[k];
        return;
    }
    int mij=(st+dr)/2,p=-1,q=-1;
    if(a<=mij)
        srch(st,mij,k*2);
    if(b>=mij+1)
        srch(mij+1,dr,2*k+1);

}

int main()
{
    freopen("arbint.out","w",stdout);
    citire();
    creare_arbore(0,n-1,1);
    int op;
    for(int i=0; i<m; i++)
    {
        scanf("%d %d %d",&op,&a,&b);
        if(op==1)
        {
            a--;
            update(0,n-1,1);
        }
        else
        {
            a--,b--;
            ma=-1;
            if(a>b)
                swap(a,b);
            srch(0,n-1,1);
            printf("%d\n",ma);

        }
    }
    return 0;
}