Pagini recente » Cod sursa (job #324494) | Cod sursa (job #965034) | Cod sursa (job #1548505) | Cod sursa (job #1933188) | Cod sursa (job #663190)
Cod sursa(job #663190)
// http://infoarena.ro/problema/arbint
#include <fstream>
using namespace std;
#define leftSon 2 * node
#define rightSon 2 * node + 1
#define begin first
#define end second
const int MAXSIZE = 100001;
ifstream in("arbint.in");
ofstream out("arbint.out");
int length,operations;
int targetPosition,value,maxim;
pair<int,int> interval;
int tree[4*MAXSIZE];
void update(int node,int left,int right);
void query(int node,int left,int right);
int main()
{
in >> length >> operations;
for(targetPosition=1;targetPosition<=length;targetPosition++)
{
in >> value;
update(1,1,length);
}
bool type = false;
for(int i=1;i<=operations;i++)
{
in >> type;
if(type)
{
in >> targetPosition >> value;
update(1,1,length);
}
else
{
in >> interval.begin >> interval.end;
maxim = 0; // reset;
query(1,1,length);
out << maxim << "\n";
}
}
in.close();
out.close();
return (0);
}
void update(int node,int left, int right)
{
if(left == right)
{
tree[node] = value;
return;
}
else
{
int middle = (left + right) / 2;
if(targetPosition <= middle)
update(leftSon,left,middle);
else
update(rightSon,middle+1,right);
}
tree[node] = max(tree[leftSon],tree[rightSon]);
}
void query(int node,int left, int right)
{
if(interval.begin <= left && right <= interval.end)
maxim = max(maxim,tree[node]);
else
{
int middle = (left + right) / 2;
if(interval.begin <= middle)
query(leftSon,left,middle);
if(interval.end > middle)
query(rightSon,middle+1,right);
}
}