Cod sursa(job #1005430)

Utilizator andreifirstCioara Andrei Ioan andreifirst Data 5 octombrie 2013 01:47:51
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 2 kb
#include <iostream>
#include <fstream>
#include <cstdio>
#include <sstream>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <cstdlib>
#include <map>
#include <set>
#include <stack>
#include <queue>
#include <utility>
#include <string>
#include <vector>

using namespace std;

typedef vector<int> vi;
typedef pair<int, int> ii;
typedef vector<ii> vii;
typedef vector<vi> vvi;
typedef vector<string> vs;
typedef map<string, int> msi;
typedef long long ll;
typedef unsigned long long ull;

typedef vector<int>::iterator vit;
typedef vector<ii>::iterator viit;
typedef vector<string>::iterator vst;

#define REP(i, n) for (int i = 1; i <= n; ++i)
#define FOR(i, a, b) for (int i = a; i <= b; ++i)
#define FORD(i, a, b) for (int i = a-1; i >= b; --i)
#define MP make_pair
#define PB push_back
#define ALL(x) (x).begin(), x.end()
#define SIZE(x) (int)(x).size()
#define FOREACH(it, c) for (__typeof(c.begin()) it = c.begin(); it != c.end(); ++it)
#define INF 1023456789
#define DEBUG(x) cerr << #x << ": " << x << endl;
#define ERR(...) fprintf(stderr, __VA_ARGS__);


ifstream f("arbint.in");
ofstream g("arbint.out");

#define offset 131072

int arb[2*offset+1];
int x, y, i, j, n, m, z;

void update (int level){
	if (level) {
		arb[level] = max (arb[level*2], arb[level*2+1]);
		update (level/2);
	}
}

void update (int level, int value) {
	arb[level] = value;
	update(level/2);
}

int query (int sleft, int sright, int left, int right, int level) {
	if (sleft <= left && right <= sright) return arb[level];

	int mid = (left + right) / 2;
	int rez1 = 0;
	int rez2 = 0;
	if (sleft <= mid) rez1 = query (sleft, sright, left, mid, level*2);
	if (mid < sright) rez2 = query (sleft, sright, mid+1, right, level*2+1);
	return max(rez1, rez2);
}


int main() {
    f >> n >> m;
    REP (i, n) {
        f >> x;
        update (offset+i-1, x);
    }

    REP (i, m) {
        f >> x >> y >> z;
        if (x==0) {
            g << query (y, z, 1, offset, 1) << '\n';
        } else {
            update ((offset+y-1) , z);
        }
    }

}