Pagini recente » Cod sursa (job #887891) | Cod sursa (job #50972) | Cod sursa (job #3183531) | Cod sursa (job #244628) | Cod sursa (job #1760738)
#include <stdio.h>
#include <vector>
using namespace std;
int numberOfElements;
int numberOfQueries;
int beginQueryInterval;
int endQueryInterval;
int maximum;
int position;
int value;
vector<int> intervalTree(400500);
void Update(int currentNod, int beginInterval, int endInterval)
{
if( beginInterval == endInterval )
{
intervalTree[currentNod] = value;
return;
}
else
{
int middle = (beginInterval + endInterval) >> 1;
position <= middle ? Update(currentNod << 1, beginInterval, middle) :
Update((currentNod << 1) +1, middle + 1, endInterval);
intervalTree[currentNod] = max( intervalTree[currentNod << 1], intervalTree[(currentNod << 1) + 1] );
}
}
void BuildIntervalTree()
{
scanf("%d%d", &numberOfElements, &numberOfQueries);
for( int i = 1; i<=numberOfElements; ++i )
{
scanf("%d", &value);
position = i;
Update(1, 1, numberOfElements);
}
}
void MaximumValueOfInterval(int currentNod, int beginInterval, int endInterval)
{
if( beginQueryInterval <= beginInterval && endQueryInterval >= endInterval )
{
if( maximum < intervalTree[currentNod] )
{
maximum = intervalTree[currentNod];
}
return;
}
else
{
int middle = ((beginInterval + endInterval)) >> 1;
if( beginQueryInterval <= middle)
{
MaximumValueOfInterval(currentNod << 1, beginInterval, middle);
}
if( middle < endQueryInterval )
{
MaximumValueOfInterval((currentNod << 1) + 1, middle + 1, endInterval);
}
}
}
void ProcessQueries()
{
int queryType;
int aux1;
int aux2;
while(numberOfQueries--)
{
scanf("%d%d%d", &queryType, &aux1, &aux2);
if( !queryType )
{
maximum = -1;
beginQueryInterval = aux1;
endQueryInterval = aux2;
MaximumValueOfInterval(1, 1, numberOfElements);
printf("%d\n", maximum);
}
else
{
position = aux1;
value = aux2;
Update(1, 1, numberOfElements);
}
}
}
int main()
{
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
BuildIntervalTree();
ProcessQueries();
return 0;
}