Pagini recente » Cod sursa (job #2770912) | Cod sursa (job #1028942) | Cod sursa (job #985342) | Cod sursa (job #2116988) | Cod sursa (job #749588)
Cod sursa(job #749588)
#include<cstdio>
#define NMAX 400500
#define NMAX2 1000015
#define maxim(a,b) ((a>b)?(a):(b))
using namespace std;
int SegT[NMAX];
char line[NMAX2];
int Sol,A,B,N,k,M,begin,op;
inline int left_son(int nod)
{
return nod<<1;
}
inline int right_son(int nod)
{
return (nod<<1)+1;
}
bool verif(int left)
{
if(left<=k)
return true;
return false;
}
void update(int nod, int left, int right)
{
if(left==right)
{
SegT[nod]=B;
return;
}
int mid;
mid=left+(right-left)/2;
if(A<=mid)
update(left_son(nod),left,mid);
else
update(right_son(nod),mid+1,right);
if(verif(mid+1))
SegT[nod]=maxim(SegT[left_son(nod)],SegT[right_son(nod)]);
else
SegT[nod]=SegT[left_son(nod)];
}
void query(int nod, int left, int right)
{
if(A<=left && right<=B)
{
Sol=maxim(Sol,SegT[nod]);
return;
}
int mid;
mid=left+(right-left)/2;
if(A<=mid)
query(left_son(nod),left,mid);
if(B>mid)
query(right_son(nod),mid+1,right);
}
bool digit(char chs)
{
if('0'<=chs && chs<='9')
return true;
return false;
}
int compute(int &n)
{
n=0;
for(;digit(line[begin]);begin++)
n=n*10+int(line[begin]-'0');
begin++;
return n;
}
void citire_SegT()
{
fgets(line+1,NMAX2-5,stdin);
begin=1;
compute(N);
compute(M);
fgets(line+1,NMAX2-5,stdin);
begin=1;
for(k=1;k<=N;k++)
{
compute(B);
A=k;
update(1,1,N);
}
}
void citire_Query()
{
fgets(line+1,NMAX2-5,stdin);
begin=1;
compute(op);
compute(A);
compute(B);
}
int main()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
//scanf("%d %d",&N,&M);
citire_SegT();
while(M--)
{
citire_Query();
if(op==0)
{
Sol=-1;
query(1,1,N);
printf("%d\n",Sol);
}
else
update(1,1,N);
}
return 0;
}