Description
Input
Output
Sample Input
Sample Output
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int mx;
int s1[200100],s2[1000000];
int build(int l,int r,int p)
{
if (l==r) return s2[p]=s1[l];
int m=(l+r)/2;
int a=build(l,m,2*p);
int b=build(m+1,r,2*p+1);
return s2[p]=max(a,b);
}
int un(int l,int r,int p,int pos,int c)
{
if (l==r&&l==pos) return s2[p]=c;
if (l>pos||r<pos) return s2[p];
int m=(l+r)/2;
int a=un(l,m,2*p,pos,c);
int b=un(m+1,r,2*p+1,pos,c);
return s2[p]=max(a,b);
}
void find(int l,int r,int p,int ll,int rr)
{
if (ll<=l&&rr>=r) {mx=max(mx,s2[p]);return ;}
if (l>rr||r<ll) return ;
// if (l==r) return ;
int m=(l+r)/2;
find(l,m,2*p,ll,rr);
find(m+1,r,2*p+1,ll,rr);
return ;
}
int main()
{
int n,m,i,a,b;
char s;
while (~scanf("%d%d",&n,&m))
{
for (i=1;i<=n;i++) scanf("%d",&s1[i]);
build(1,n,1);
while (m--)
{
getchar();
scanf("%c %d %d",&s,&a,&b);
// printf("****%c****%d***%d\n",s,a,b);
if (s==‘U‘) un(1,n,1,a,b);
else
{
mx=0;
int ra=min(a,b);
int rb=max(a,b);
find(1,n,1,ra,rb);
printf("%d\n",mx);
}
}
}
return 0;
}
原文:http://www.cnblogs.com/pblr/p/4717977.html