Cod sursa(job #2012945)

Utilizator mihai.alphamihai craciun mihai.alpha Data 19 august 2017 21:31:53
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
#include <stdio.h>

FILE *fin, *fout;

#define MAX 1 << 17

int M, N;
int v[MAX], arb[MAX * 2 + 2];

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

int update(int rad, int poz, int val, int st, int dr)  {
    if(st > dr)
        return 0;
    if(st == dr)  {
        arb[rad] = val;
        return val;
    }
    if(st <= poz && (st + dr) / 2 >= poz)
        update(rad * 2, poz, val, st, (st + dr) / 2);
    else
        update(rad * 2 + 1, poz, val, (st + dr) / 2 + 1, dr);
    arb[rad] = maxi(arb[rad * 2], arb[rad * 2 + 1]);
    return arb[rad];
}

int ans1;

int query(int rad, int a, int b, int st, int dr)  {
    if(st > dr)
        return 0;
    if(a <= st && b >= dr)
        ans1 = maxi(arb[rad], ans1);
    if(st == dr)  {
        return arb[rad];
    }
    else  {
        query(rad * 2, a, b, st, (st + dr) / 2);
        query(rad * 2 + 1, a, b, (st + dr) / 2 + 1, dr);
    }
    return arb[rad];
}

int main()  {
    fin = fopen("arbint.in", "r");
    fout = fopen("arbint.out", "w");
    fscanf(fin, "%d%d", &N, &M);
    for(int i = 1;i <= N;i++)  {
        fscanf(fin, "%d", &v[i]);
        update(1, i, v[i], 1, N);
    }
    for(int i = 1;i <= N;i++)  {
        int op, a, b;
        ans1 = 0;
        fscanf(fin, "%d%d%d", &op, &a, &b);
        if(op == 0)
            query(1, a, b, 1, N), fprintf(fout, "%d\n", ans1);
        else
            update(1, a, b, 1, N);
    }
    fclose(fin);
    fclose(fout);
    return 0;
}