Cod sursa(job #1869460)

Utilizator mihai.alphamihai craciun mihai.alpha Data 5 februarie 2017 20:29:28
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.23 kb
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

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

#define MAX 100010

#define getmax(a, b) (a > b) ? a : b
#define getmin(a, b) (a < b) ? a : b

int v[MAX * 8], tree[MAX * 8], N, M;

void build(int nod, int st, int dr)  {
    if(st > dr)
        return;
    if(st == dr)  {
        tree[nod] = v[st];
        return;
    }
    build(nod * 2, (st + dr) / 2 + 1, dr);
    build(nod * 2 + 1, st, (st + dr) / 2);
    tree[nod] = getmax(tree[nod * 2], tree[nod * 2 + 1]);
}

void update(int st, int dr, int nod, int val, int poz)  {
    if(st == dr)  {
        tree[nod] = val;
        return;
    }
    int mid = (st + dr) >> 1;
    if(poz <= mid)
        update(st, mid, nod * 2, val, poz);
    else
        update(mid + 1, dr, nod * 2 + 1, val, poz);
    tree[nod] = getmax(tree[nod * 2], tree[nod * 2 + 1]);
}

int quer;

void query(int c1, int c2, int st, int dr, int nod)  {
    if(c1 >= st && c2 <= dr)  {
        quer = getmax(quer, tree[nod]);
        return;
    }
    int mid = (c1 + c2) >> 1;
    if(st <= mid)  {
        query(c1, mid, st, dr, nod * 2);
    }
    if(dr > mid)  {
        query(mid + 1, c2, st, dr, nod * 2 + 1);
    }
}
#define fi inline
#define BUF 1 << 17
int pos = BUF;
char buf[BUF];

fi char next()  {
    if(pos == BUF)
        fread(buf, 1, BUF, fin), pos = 0;
    return buf[pos++];
}

fi int read()  {
    int x = 0, semn = 1;
    char c = next();
    while(!isdigit(c) && c != '-')
        c = next();
    if(c == '-')
        semn = -1, c = next();
    while(isdigit(c))  {
        x = x * 10 + c - '0';
        c = next();
    }
    return x * semn;
}

int main()  {
    N = read(), M = read();
    for(int i = 1;i <= N;i++)  {
        v[i] = read();
    }
    build(1, 1, N);
    for(int i = 0;i < M;i++)  {
        int x, st, dr;
        x = read(), st = read(), dr = read();
        switch(x)  {
            case 0:
            quer = 0;
            query(1, N, st, dr, 1);
            fprintf(fout, "%d\n", quer);
            break;
            case 1:
            update(1, N, 1, dr, st);
        }
    }
    fclose(fin);
    fclose(fout);
    return 0;
}