Cod sursa(job #1076354)

Utilizator handz.FMI Andrei Tanasescu handz. Data 10 ianuarie 2014 01:55:50
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
#include <iostream>
#include <fstream>
using namespace std;

ifstream f("arbint.in");
ofstream g("arbint.out");

#define maxN 500005
#define MIN -maxN
int n,m,v[maxN],poz,val,A,B,maxim;

inline int Maxim(int a, int b) {
       if ( a > b ) return a;
       return b;
}

void modif(int,int,int);
void getMax(int,int,int);

int main()
{
    int i,x,a,b;

    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);

    scanf("%d%d", &n, &m);

    for(i=1; i<=n ;i++)
    {
        scanf("%d", &x);
        // adaugam elem in structura, respectand structura de ArbInt
        poz=i; val=x;
        modif(1,1,n);
    }

    for(i=1; i<=m ;i++)
    {
        scanf("%d%d%d", &x, &a, &b);
        if(x==1)
        {
            poz=a; val=b;
            modif(1,1,n);
        }
        else
        {
            maxim=MIN;
            A=a; B=b;
            getMax(1,1,n);

            printf("%d\n", maxim);
        }
    }
    return 0;
}

void modif(int s,int p,int q)
{
    int mij;

    if(p==q)
    {
        v[s]=val; // e doar un element - am ajuns la cel care trebuie modificat
        return;
    }

    mij=(p+q)/2; // jumatatea intervalului

    if(poz<=mij) modif(s*2,p,mij);
    else modif(s*2+1,mij+1,q);

    v[s]=Maxim(v[s*2],v[s*2+1]);
}

void getMax(int s,int p,int q)
{
    int mij;
    if(A<=p && q<=B)
    {
        // maximul din int [a,b] este valoarea lui v[s], unde s este rad subarborelui
        if(v[s]>maxim) maxim=v[s];
        return;
    }

    mij=(p+q)/2;
    if(A<=mij) getMax(s*2,p,mij);
    if(mij<B) getMax(s*2+1,mij+1,q);
}