Pagini recente » Cod sursa (job #2037285) | Cod sursa (job #2228728) | Cod sursa (job #3223690) | Cod sursa (job #2741648) | Cod sursa (job #409512)
Cod sursa(job #409512)
#include <iostream>
#include <cstdio>
#define Nmaxx 100010
using namespace std;
struct nod
{
int val;
nod *st, *dr, *sef;
int s, e;
};
nod *niv1[Nmaxx], *v1[Nmaxx], *v2[Nmaxx], *(*surs)[Nmaxx] = &v1, *(*dest)[Nmaxx] = &v2, *tata;
int v[Nmaxx], N, M;
FILE *f=fopen("arbint.in", "r"),*g=fopen("arbint.out", "w");
void read(void)
{
fscanf(f, "%d%d", &N, &M);
for(int i = 1; i <= N; ++i)
fscanf(f, "%d", &v[i]);
}
inline int maxx(int x, int y)
{
if(x > y)
return x;
else
return y;
}
void init(void)
{
int num = N, k = 0;
for(int i = 0; i < N; ++i)
{
nod *q = new nod;
q -> val = v[i];
q -> st = q -> dr = q->sef = NULL;
q -> s = q -> e = i;
niv1[++k] = v1[k] = q;
}
surs = &v1;
dest = &v2;
while(1)
{
int poz = 0, imp = 0;
if(num%2)
{
--num;
imp =1;
}
for(int i = 1; i <= num; i += 2)
{
nod *q = new nod;
q -> val = maxx((*surs)[i] -> val,(*surs)[i+1] -> val);
q -> st = (*surs)[i];
q -> dr = (*surs)[i+1];
q -> sef = NULL;
q -> s = (*surs)[i] -> s;
q -> e = (*surs)[i+1] -> e;
(*surs)[i] -> sef = q;
(*surs)[i+1] -> sef = q;
(*dest)[++poz] = q;
}
if(imp)
{
++num;
nod *q = new nod;
q -> val = (*surs)[num] -> val;
q -> sef = NULL;
q -> st = (*surs)[num], q->dr = NULL;
q -> s = q->e = (*surs)[num] -> s;
(*surs)[num] -> sef = q;
(*dest)[++poz] = q;
}
swap(surs, dest);
num = num/2 + num%2;
if(num/2 + num%2 == 1)
break;
}
}
int query(nod *tata, int a, int b)
{
int maxx = v[a];
nod *nodCur = tata;
while(1)
{
if(nodCur -> s >= a && nodCur-> e <= b)
{
if(nodCur -> val > maxx)
maxx = nodCur -> val;
break;
}
if(nodCur -> dr -> s >= a && nodCur -> dr -> e <= b)
if(nodCur -> dr -> val > maxx)
maxx = nodCur -> dr -> val ;
if(nodCur -> st -> s <= a && nodCur -> st -> e >= a)
nodCur = nodCur -> st;
else
nodCur = nodCur -> dr;
}
while(1)
{
if(nodCur -> s >= a && nodCur-> e <= b)
{
if(nodCur -> val > maxx)
maxx = nodCur -> val;
break;
}
if(nodCur -> st -> s >= a && nodCur -> st -> e <= b)
if(nodCur -> st -> val > maxx)
maxx = nodCur -> st -> val ;
if(nodCur -> dr -> s <= a && nodCur -> dr -> e >= a)
nodCur = nodCur -> dr;
else
nodCur = nodCur -> st;
}
return maxx;
}
void update(nod *tata, int a, int b)
{
nod *nodCur = tata;
while(1)
{
if(nodCur -> st == NULL)
break;
if(tata -> st -> s <= a && tata -> st -> e >= a)
nodCur = nodCur -> st;
else
nodCur = nodCur -> dr;
}
nodCur -> val = b;
while(1)
{
if(nodCur -> sef == NULL)
break;
nodCur = nodCur -> sef;
if(nodCur -> dr != NULL)
nodCur -> val = max(nodCur -> st -> val, nodCur -> dr -> val);
else
nodCur -> val = nodCur -> st -> val;
}
}
void solve(void)
{
init();
tata = (*surs)[1];
for(; M; --M)
{
int op, a, b;
fscanf(f, "%d%d%d", &op, &a, &b);
if(!op)
fprintf(g, "%d\n", query(tata, a, b) );
else
update(tata, a, b);
}
}
int main(void)
{
read();
solve();
return 0;
}