Nu aveti permisiuni pentru a descarca fisierul grader_test6.in
Cod sursa(job #1005429)
Utilizator | Data | 5 octombrie 2013 01:44:48 | |
---|---|---|---|
Problema | Arbori de intervale | Scor | 50 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 2.04 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;
inline void update (int level){
while (level) {
arb[level] = max (arb[level*2], arb[level*2+1]);
level /= 2;
}
}
inline 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 (left > right) return 0;
if (sleft <= left && right <= sright) return arb[level];
int mid = (left + right) / 2;
int rez = 0;
if (sleft <= mid) rez = max (rez, query (sleft, sright, left, mid, level*2));
if (mid < sright) rez = max (rez, query (sleft, sright, mid+1, right, level*2+1));
return rez;
}
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);
}
}
}