Mai intai trebuie sa te autentifici.
Cod sursa(job #1760237)
Utilizator | Data | 20 septembrie 2016 16:12:02 | |
---|---|---|---|
Problema | Arbori de intervale | Scor | 0 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.41 kb |
#include<fstream>
#include<iostream>
#define MAX_LEN 100005
#define MININT -1000000000
#define max(a,b) ((a<b)?b:a)
using namespace std;
int vec[MAX_LEN];
int arb[262145];
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 query(int qlow,int qhigh,int low, int high, int pos)
//{
// if(qlow<=low && qhigh >= high)
// return arb[pos];
// if(qlow>high || qhigh<low)
// return MININT;
// int mid=(low+high)/2;
// return max(query(qlow,qhigh,low,mid,2*pos+1),query(qlow,qhigh,mid+1,high,2*pos+2));
//}
//
void update( int ind,int value,int x )
{
int pos=x+ind;
arb[pos]=value;
while(pos!=0)
{
pos=(pos-1)/2;
arb[pos]=max(arb[2*pos+1],arb[2*pos+2]);
}
}
int main()
{
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];
int x=1;
while(x<N)
x*=2;
x--;
for(i=0;i<2*x+1;i++)
arb[i]=MININT;
buildTree(0,x,0,N);
int A,B,C;
for(i=0;i<M;i++)
{
f>>A>>B>>C;
//if(A==0)
// g<<query(B-1,C-1,0,x,0)<<endl;
if(A==1)
update(B-1,C,x);
}
}