Cod sursa(job #2414312)

Utilizator marinaoprOprea Marina marinaopr Data 24 aprilie 2019 14:35:58
Problema Arbori de intervale Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.42 kb
#include <stdio.h>
#include <iostream>

#define NMAX 100005

using namespace std;

FILE *fin = fopen("arbint.in", "r");
FILE *fout = fopen("arbint.out", "w");

int n,A[NMAX],v[4*NMAX],i,q,cerinta,a,b;

void build(int nod, int left, int right)
{
    if(left == right)
    {
        v[nod] = A[left];
        return;
    }

    int mid = (left+right) /2;
    build(2*nod, left, mid);
    build(2*nod+1, mid+1, right);
    v[nod] = max(v[2*nod], v[2*nod+1]);
}

void update(int nod, int left, int right)
{
    if(left == right)
    {
        A[left] = b;
        return;
    }

    int mid = (left+right) /2;
    if(a <= mid)
        update(2*nod, left, mid);
    else
        update(2*nod+1, mid+1, right);
}

int query(int nod, int left, int right)
{
    int r1 = 0, r2 = 0;

    if(left == right)
        return A[left];

    int mid = (left+right) /2;
    if(a <= mid)
        r1 = query(2*nod, left, mid);
    if(b > mid)
        r2 = query(2*nod+1, mid+1, right);
    return max(r1, r2);
}

int main()
{
    fscanf(fin, "%d%d", &n,&q);
    for(i=1; i<=n; ++i)
        fscanf(fin, "%d", &A[i]);

    build(1, 1, n);

    while(q)
    {
        fscanf(fin, "%d%d%d", &cerinta,&a,&b);

        if(cerinta)
            update(1, 1, n);
        else
            fprintf(fout, "%d\n", query(1, 1, n));

        --q;
    }

    fclose(fin);
    fclose(fout);
    return 0;
}