Pagini recente » Cod sursa (job #88045) | Cod sursa (job #1058320) | Cod sursa (job #767749) | Cod sursa (job #134612) | Cod sursa (job #852453)
Cod sursa(job #852453)
#include<fstream>
#include<algorithm>
#include<vector>
using namespace std;
const int Nmax = 100001;
ofstream g("arbint.out");
int V[Nmax], N, M, Q, rad, lo, hi, poz, val;
vector<int> st, dr, arb;
char *buff;
int ind, lenght;
void update() {
int i, j;
V[poz] = val;
for(i=1; i<=Q; ++i)
if(st[i] <= poz && poz <= dr[i]) {
arb[i] = -1;
for(j=st[i]; j<=dr[i]; ++j)
arb[i] = max(arb[i], V[j]);
}
}
int query() {
int i, rez, left, right;
rez = -1;
left = 1<<30;
right = -1;
for(i=1; i<=Q; ++i) {
if(lo <= st[i] && dr[i] <= hi) {
left = min(left, st[i]);
right = max(right, dr[i]);
rez = max(rez, arb[i]);
}
if(hi > dr[i])
break;
}
if(left == 1<<30 && right == -1)
left = right = hi;
for(i=lo; i<=left; ++i)
rez = max(rez, V[i]);
for(i=right; i<=hi; ++i)
rez = max(rez, V[i]);
return rez;
}
void build() {
int i, j;
for(rad=1; rad*rad<=N; ++rad);
--rad;
Q = N/rad + 1;
st.resize(Q+1);
dr.resize(Q+1);
arb.resize(Q+1);
for(i=1; i<=Q; ++i) {
arb[i] = -1;
st[i] = rad*(i-1)+1;
dr[i] = rad*i;
for(j=st[i]; j<=dr[i]; ++j)
arb[i] = max(arb[i], V[j]);
}
}
int get_number() {
int number = 0;
while(ind<lenght && !(buff[ind]>='0' && buff[ind]<='9'))
++ind;
while(ind<lenght && buff[ind]>='0' && buff[ind]<='9') {
number = number * 10 + buff[ind] - '0';
++ind;
}
return number;
}
int main() {
ifstream f;
f.open("arbint.in");
f.seekg(0, ios::end);
lenght = f.tellg();
buff = new char[lenght];
f.seekg(0, ios::beg);
f.read(buff, lenght);
f.close();
int i, op;
N = get_number(); M = get_number();
for(i=1; i<=N; ++i)
V[i] = get_number();
build();
while(M--) {
op = get_number();
if(op == 0) {
lo = get_number(); hi = get_number();
g<<query()<<"\n";
continue;
}
if(op == 1) {
poz = get_number(); val = get_number();
update();
continue;
}
}
g.close();
return 0;
}