Pagini recente » Cod sursa (job #1045739) | Cod sursa (job #2678637) | Cod sursa (job #1668134) | Cod sursa (job #2409951) | Cod sursa (job #2268366)
#include <fstream>// BATOG PENTRU LABORATOR ASD
#include <vector>
#include <queue>
#define NMAX 100002
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int a[NMAX], i, N, x, ok, d = 1, pozMin[1001], op, M, y;
const int infinit = ((1 << 30) - 1) * 2 + 1;
int Querry(int st, int dr) {
int poz = st;
while (st % d != 0 && st <= dr) {
if (a[st] > a[poz]) poz = st;
st++;
}
while (st + d <= dr) {
if (a[pozMin[st / d]] > a[poz]) poz = pozMin[st / d];
st += d;
}
while (st <= dr) {
if (a[st] > a[poz]) poz = st;
st++;
}
return poz;
}
void Update(int poz, int val) {
int Bucket = poz / d;
if(poz == pozMin[Bucket] ) {
a[poz] = val;
for(int i = Bucket * d; i < (Bucket + 1) * d; i++)
if (a[i] > a[pozMin[Bucket]]) pozMin[Bucket] = i;
}
else if (val > a[pozMin[Bucket]]) pozMin[Bucket] = poz;
a[poz] = val;
}
int main() {
f>>N>>M;
for (i = 0; i < N; i++) {
f>>a[i];
}
while (d * d <= N) ++d;
for (i = 0; i < N; i++) {
if (i % d == 0) pozMin[i / d] = i;
if (a[i] > a[pozMin[i / d]]) pozMin[i / d] = i;
}
for (i = 0; i < M; i++) {
f>>op>>x>>y;
if (op == 0) g<<a[Querry(x-1, y-1)]<<'\n';
else Update(x-1, y);
}
return 0;
}