Cod sursa(job #1603711)

Utilizator NacuCristianCristian Nacu NacuCristian Data 17 februarie 2016 18:50:28
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <iostream>
#include <stdio.h>
#include <vector>

using namespace std;


int sir[100010];
int a[200010],n,m;
int x,y,z;

int creare(int st, int dr, int k)
{
    if(st==dr)
        return (a[k]=sir[st]);
    int mij=(st+dr)/2;
    return (a[k]=max(creare(st,mij,2*k),creare(mij+1,dr,2*k+1)));
}

void update(int st, int dr, int k)
{
    if(st==dr && st==y)
    {
         a[k]=z;
         return;
    }

    int mij=(st+dr)/2;

    if(mij>=y)
    {
        update(st,mij,2*k);
        a[k]=max(a[2*k],a[2*k+1]);
        return;
    }

    update(mij+1,dr,2*k+1);
    a[k]=max(a[2*k],a[2*k+1]);
    return;
}

int ma=-1;

void maxim(int st, int dr, int k)
{
    if(st>=y && dr<=z)
    {
        if (a[k]>ma)
            ma=a[k];
        return;
    }

    int mij=(st+dr)/2;
    if(y<=mij)
        maxim(st,mij,2*k);
    if(z>=mij+1)
        maxim(mij+1,dr,2*k+1);

}

void citire()
{
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    scanf("%d %d",&n,&m);
    for(int i=0;i<n;i++)
        scanf("%d ",&sir[i]);
    creare(0,n-1,1);
    for(int i=0;i<m;i++)
    {

        scanf("%d %d %d",&x,&y,&z);
        if(x==0)
        {
            ma=-1;
            y--;
            z--;
            maxim(0,n-1,1);
            printf("%d\n",ma);
        }
        else
        {
            y--;
            update(0,n-1,1);
        }
    }

}

int main()
{
    citire();

    return 0;
}