Cod sursa(job #1207680)

Utilizator mariusn01Marius Nicoli mariusn01 Data 13 iulie 2014 16:17:25
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include <cstdio>
#define DIM 100010

using namespace std;

int A[4*DIM];
int S[4*DIM];

int n, m, i, a, b, x, t;

inline int maxim(int a, int b) {
    return ( a>b ? a : b );
}

int query(int nod, int st, int dr, int a, int b) {
    if (a<=st && dr <= b) {
        return maxim(A[nod] , S[nod]);
    }

    int m = (st + dr)/2, mst = 0, mdr = 0;
    if (S[nod] != 0) {
        A[nod] = S[nod];
        S[2*nod] = S[nod];
        S[2*nod+1] = S[nod];
        S[nod] = 0;
    }

    if (a <= m)
        mst = query(2*nod, st, m, a, b);
    if (b >= m+1)
        mdr = query(2*nod+1, m+1, dr, a, b);
    return maxim(mst, mdr);
}

void update(int nod, int st, int dr, int a, int b, int x) {
    if (a <= st && dr <= b) {
        S[nod] = x;
        return;
    }
    int m = (st + dr)/2;
    if (S[nod] != 0) {
        A[nod] = S[nod];
        S[2*nod] = S[nod];
        S[2*nod+1] = S[nod];
        S[nod] = 0;
    }
    if (a <= m)
        update(2*nod, st, m, a, b, x);
    if (b >= m+1)
        update(2*nod+1, m+1, dr, a, b, x);

    A[nod] = maxim(S[2*nod] == 0 ? A[2*nod] : maxim(A[2*nod] , S[2*nod]),S[2*nod+1] == 0 ? A[2*nod+1] :  maxim(A[2*nod+1] , S[2*nod+1]));
}

int main() {

    FILE *fin = fopen("arbint.in", "r");
    FILE *fout = fopen("arbint.out", "w");
    fscanf(fin, "%d %d", &n, &m);

    for (i=1;i<=n;i++) {
        fscanf(fin, "%d", &x);
        update(1, 1, n, i, i, x);
    }

    for (i=1;i<=m;i++) {
        fscanf(fin, "%d %d %d", &t, &a, &b);
        if (t == 1) {
            update(1, 1, n, a, a, b);
        } else {
            fprintf(fout,"%d\n",query(1, 1, n, a, b));
        }
    }

    return 0;
}