线段树

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <iterator>

#include <cstdio>
#include <cstdlib>
#include <cstring>

using namespace std;

vector<int> segTree;
vector<int> array;
int N,M;

void build(int node,int left,int right)
{
	if(left == right)
		segTree.at(node) = array.at(left);
	else
	{
		build(node*2,left,(left+right)/2);
		build(node*2+1,(left+right)/2+1,right);
		segTree.at(node) = max(segTree.at(node*2) , segTree.at(node*2+1));
	}
}

int query(int node,int left,int right,int i,int j)
{
	if(j < left || i > right)
		return -1;
	if(i <= left && j >= right)
		return segTree.at(node);
	int p1,p2;
	p1 = query(node*2,left,(left+right)/2,i,j);
	p2 = query(node*2+1,(left+right)/2+1,right,i,j);
	if(-1 == p1)
		return p2;
	if(-1 == p2)
		return p1;
	return max(p1,p2);
}

void update(int node,int left,int right,int pos,int val)
{
	if(left == right)
		segTree.at(node) = val;
	else
	{
		int mid = (left+right)/2;
		if(pos <= mid)
			update(node*2,left,mid,pos,val);
		else
			update(node*2+1,mid+1,right,pos,val);
		segTree.at(node) = max(segTree.at(node*2) , segTree.at(node*2+1));
	}
}

int main()
{
	freopen("in.txt","r",stdin);
/////////////////////////////////////////////////////////////////////

	while(scanf("%d%d",&N,&M) != EOF)
	{
		segTree.resize(N*4,0);
		array.resize(N);
		for(int j=0;j<N;++j)
		{
			scanf("%d",&array.at(j));
		}
		build(1,0,N-1);
		char ch[20]={0};
		while(M--)
		{
			int pa,pb;
			scanf("%s%d%d",ch,&pa,&pb);
			if( strcmp(ch,"U")==0 )
				update(1,0,N-1,pa-1,pb);
			else
				cout<<query(1,0,N-1,pa-1,pb-1)<<endl;
		}
	}


/////////////////////////////////////////////////////////////////////
	fclose(stdin);
	return 0;
}


你可能感兴趣的:(线段树)