Cod sursa(job #2115146)

Utilizator amaliarebAmalia Rebegea amaliareb Data 26 ianuarie 2018 13:09:16
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 2.03 kb
#include <iostream>
#include <fstream>
#include <cmath>

using namespace std;
//ifstream f("arbint.in");
ofstream g("arbint.out");
const int MaxN = 100005;
const int BUF_SIZE = 1 << 17;
int v[MaxN], n, m, maxi[400], bsize, nrb;

int pos = BUF_SIZE, out = 0;
char buf[BUF_SIZE], Out[BUF_SIZE], str[10];
FILE *f = fopen("arbint.in", "r");
inline char nextch(){
    if(pos==BUF_SIZE) fread(buf, BUF_SIZE, 1, f), pos=0;
    return buf[pos++];
}
inline int read(){
    int x=0;
    char ch=nextch();
    while(!isdigit(ch)) ch=nextch();
    while(isdigit(ch)){
        x=10*x+ch-'0';
        ch=nextch();
    }
    return x;
}


inline void update(int poz, int val) {
    v[poz] = val;
    int bucket = (poz - 1) / bsize + 1;
    if (bucket <= nrb) {
        if (maxi[bucket] <= v[poz]) maxi[bucket] = v[poz];
        else {
            maxi[bucket] = 0;
            for (int j = 1; j <= bsize; ++j) maxi[bucket] = max(maxi[bucket], v[(bucket - 1) * bsize + j]);
        }
    }
}

inline int query(int l, int r) {
    int ans = 0;
    if (r - l + 1 < bsize) {
        for (int i = l; i <= r; ++i) ans = max(ans, v[i]);
        return ans;
    }
    int bucket = (l - 2) / bsize + 1;
    while (l <= r && l <= bucket * bsize) {
        ans = max(ans, v[l]);
        ++l;
    }
    if (l == r) return max(ans, v[l]);
    bucket = r / bsize;
    while (r >= l && r > bucket * bsize) {
        ans = max(ans, v[r]);
        --r;
    }
    while (l <= r) {
        ans = max(ans, maxi[(l - 1) / bsize + 1]);
        l += bsize;
    }
    return ans;
}

int main()
{
    n = read(); m = read();
    for (int i = 1; i <= n; ++i) v[i] = read();
    bsize = sqrt(n) + 2;
    for (int i = 1; bsize * i <= n; ++i)
    for (int j = 1; j <= bsize; ++j) {
        maxi[i] = max(maxi[i], v[bsize * (i - 1) + j]);
        nrb = i;
    }
    for (int i = 1; i <= m; ++i) {
        int c = read(), a = read(), b = read();
        if (c == 0) g << query(a, b) << '\n';
        else update(a, b);
    }
    return 0;
}