the reason of failure:1、又一次被cin的速度坑了!!!注意大数据要用scanf的输入方法啊。
learning:1、线段树是用来干嘛的,是可以找区间最大最小值或者和之类的值的。
thinking:每次这个线段的max1取max(max1,weight)。也就是判断改变的这个值,是否大于这个线段的max1,如果大就更改。
代码:
#include<iostream>
#include <string.h>
#include <stdio.h>
#define MAXN 200001
using namespace std;
struct ttt{
int left,right,max1;
};
ttt tree[MAXN*3];
int sum,node[MAXN];;
void init(int x,int y,int num){ //构造线段树
tree[num].left=x;
tree[num].right=y;
if(x==y){
tree[num].max1=node[x];
// cout << num<< "\t"<<tree[num].weight <<endl;
}else{
init(x,(x+y)/2,num+num);
init((x+y)/2+1,y,num+num+1); //1、记得给其上一个线段的结点赋值。
tree[num].max1=max(tree[num+num].max1,tree[num+num+1].max1);
}
}
void bian(int x,int num,int weight){ //像二分一样找在左还是在右,因为是一个点,所以只能在一个地方
tree[x].max1=max(tree[x].max1,weight);
if(tree[x].left==num&&tree[x].right==num){
tree[x].max1=weight;
}else if((tree[x].left+tree[x].right)/2>=num){
bian(x+x,num,weight);
}else if((tree[x].right+tree[x].left)/2<num){
bian(x+x+1,num,weight);
}
}
void find1(int num,int x,int y){ //在区间内,或者只找左,只找右,或者全找。
if(tree[num].left>=x&&tree[num].right<=y){
sum=max(sum,tree[num].max1);
}else if(x>(tree[num].left+tree[num].right)/2){
find1(num+num+1,x,y);
}else if(y<=(tree[num].left+tree[num].right)/2){
find1(num+num,x,y);
}else{
find1(num+num,x,y);
find1(num+num+1,x,y);
}
}
int main(){ //再一次,大数据的输入,scanf远远快于cin
freopen("in.txt","r",stdin);
memset(tree,0,sizeof(tree));
int n,m,i,j,k,l,t1,t2,t3,f1,f2;
char st1;
while(scanf("%d%d",&n,&m)!=EOF){
for(i=1;i<=n;i++)
scanf("%d",&node[i]);
init(1,n,1);
while(m--){
cin >> st1;
scanf("%d%d",&t1,&t2);
// getchar();
if(st1=='U'){//因为这里scanf的%c是错误的需要%s,具体原因现在没搞清楚
bian(1,t1,t2);
}else{
sum=0;
find1(1,t1,t2);
printf("%d\n",sum);
}
}
}
return 0;
}