Pagini recente » Cod sursa (job #268397) | Cod sursa (job #275896) | Monitorul de evaluare | Cod sursa (job #2799707) | Cod sursa (job #1760450)
#include<fstream>
#include<iostream>
#include<ctime>
#define MAX_LEN 100005
#define MININT 0
#define max(a,b) ((a<b)?b:a)
using namespace std;
int vec[MAX_LEN];
int arb[262145];
int x=1;
void buildTree(int low, int high, int pos,int N)
{
if(low>=N)
return;
if(low==high) {
arb[pos] = vec[low];
return;
}
int mid=(high+low)/2;
buildTree(low,mid,2*pos+1,N);
buildTree(mid+1,high,2*pos+2,N);
arb[pos]=max(arb[2*pos+1],arb[2*pos+2]);
}
int maxim=0;
void query(int qlow,int qhigh,int low, int high, int pos)
{
if(qlow<=low && qhigh >= high) {
maxim = max(maxim, arb[pos]);
return;
}
if(qlow>high || qhigh<low)
return;
int mid=(low+high)/2;
if(qlow<=mid && maxim < arb[pos<<1+1])
query(qlow,qhigh,low,mid,2*pos+1);
if(qhigh>mid && maxim < arb[pos<<1+2])
query(qlow,qhigh,mid+1,high,2*pos+2);
}
void update( int ind,int value )
{
int pos=x+ind;
arb[pos]=value;
while(pos!=0)
{
pos=(pos-1)>>1;
arb[pos]=max(arb[2*pos+1],arb[2*pos+2]);
}
}
int main()
{
clock_t begin = clock();
int N,M;
fstream f,g;
f.open("arbint.in",ios::in);
g.open("arbint.out",ios::out);
f>>N>>M;
int i=0;
for(i=0;i<N;i++)
f>>vec[i];
while(x<N)
x*=2;
x--;
buildTree(0,x,0,N);
int A,B,C;
for(i=0;i<M;i++)
{
f>>A>>B>>C;
if(A==0) {
maxim=0;
query(B - 1, C - 1, 0, x, 0);
g << maxim << endl;
}
else
update(B-1,C);
}
clock_t end = clock();
float elapsed_secs = double(end - begin) / CLOCKS_PER_SEC;
cout<<elapsed_secs<<endl;
}