题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1754
Runtime Error
(ACCESS_VIOLATION)
哪出错了- -
//hdu1754建树creat 修改modify 查找search
#include<iostream>
using namespace std;
#define Max 400100
int MAX;
typedef struct node
{
int l,r,max;
node *left,*right;
}Node,*Tree;
int nt=1;
node tree[600010];
inline int max(int a,int b) {return a>b?a:b;}
Tree Creat(int l,int r)
{
Tree tmp=&tree[nt++];
tmp->max=0;
tmp->l=l; tmp->r=r;
if(l==r)
tmp->left=tmp->right=NULL;
else
{
int mid=(l+r)/2;
tmp->left=Creat(l,mid);
tmp->right=Creat(mid+1,r);
}
return tmp;
}
void Modify(Tree tmp,int l,int x) //l:位置 x:覆盖值
{
if(tmp->l==tmp->r)
{
tmp->max=x;
return;
}
int mid=(tmp->l+tmp->r)/2;
if(l<=mid)
Modify(tmp->left,l,x);
else
Modify(tmp->right,l,x);
tmp->max=max(tmp->left->max,tmp->right->max);
}
void Search(Tree tmp,int l,int r) //在树tmp搜索线段l_r
{
if(tmp->l==l&&tmp->r==r)
{
if(MAX<tmp->max)
MAX=tmp->max;
return;
}
int mid=(tmp->l+tmp->r)/2;
if(mid<l)
Search(tmp->right,l,r);
else if(r<=mid)
Search(tmp->left,l,r);
else
{
Search(tmp->left,l,mid);
Search(tmp->right,mid+1,r);
}
}
int main()
{
char t[2];
int N,M,A,B,i,j,x;
while( scanf("%d%d",&N,&M)!=EOF )
{
Tree T=Creat(1,N);
for(i=1;i<=N;i++)
{
scanf("%d",&x);
Modify(T,i,x);
}
for(i=1;i<=M;i++)
{
getchar();
scanf("%s%d%d",t,&A,&B);
if(t[0]=='Q') // 询问 Search
{
MAX=0;
Search(T,A,B); //A~B中的最大值
printf("%d\n",MAX);
}
else // 更新 Modify
Modify(T,A,B); //把ID为A的学生的成绩更改为B
}
}
return 0;
}