Cod sursa(job #1417130)

Utilizator karlaKarla Maria karla Data 9 aprilie 2015 17:32:13
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include <stdio.h>


using namespace std;

int A[400400], sol, p[100100], n, m;
FILE*f=fopen("arbint.in","r"),*g=fopen("arbint.out","w");


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


void build(int nod, int st, int dr)
{
    if(st == dr)
    {
        A[nod] = p[st];
    }
    else{
        int mij = (st+dr)/2;
        build(2*nod,st,mij);
        build(2*nod+1,mij+1,dr);
        A[nod] = MAx(A[2*nod],A[2*nod+1]);
    }
}


void query(int nod, int st, int dr, int x, int y)
{
    if(x <= st && dr <= y)
    {
        sol = MAx(sol,A[nod]);
    }
    else{
        int mij = (st+dr)/2;
        if(x <= mij)
            query(2*nod,st,mij,x,y);
        if(mij < y)
            query(2*nod+1,mij+1,dr,x,y);

    }
}


void update(int nod, int st, int dr, int p, int x)
{
    if(st == p && dr == p)
    {
        A[nod] = x;
    }
    else{
        int mij = (st+dr)/2;
        if(p <= mij)
            update(2*nod,st,mij,p,x);
        else
            update(2*nod+1,mij+1,dr,p,x);
        A[nod] = MAx(A[2*nod+1],A[2*nod]);
    }
}


int main()
{
    fscanf(f,"%d %d",&n,&m);
    for(int i = 1; i <= n; i++)
        fscanf(f,"%d ",&p[i]);
    build(1, 1, n);
    int q, a, b;
    for(int i = 1; i <= m; i++)
    {
        fscanf(f,"%d %d %d",&q,&a,&b);
        if(q == 0)
        {
            sol = 0;
            query(1, 1, n, a, b);
            fprintf(g,"%d\n",sol);
        }
        else
            update(1, 1, n, a, b);
    }
    return 0;
}