Cod sursa(job #1869418)

Utilizator mihai.alphamihai craciun mihai.alpha Data 5 februarie 2017 19:58:18
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 2.18 kb
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

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

#define MAX 100002

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

int v[MAX], tree[MAX];

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

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()  {
    int N = read(), M = read();
    for(int i = 1;i <= N;i++)  {
        v[i] = read();
    }
    build(1, N, 1);
    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;
}