Mai intai trebuie sa te autentifici.
Cod sursa(job #1276919)
Utilizator | Data | 26 noiembrie 2014 23:30:06 | |
---|---|---|---|
Problema | Arbori de intervale | Scor | 100 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.21 kb |
#include<cstdio>
int n,m,i,j,l,r,op,p,x,a,b,v[300100],sol;
FILE *f,*g;
int maxim(int a,int b){
if(a>b)
return a;
return b;
}
void upd(int nod,int l,int r,int p,int x){
if(l==r){
v[nod]=x;
return;
}
int mid=(l+r)>>1;
if(p<=mid)
upd((nod<<1),l,mid,p,x);
if(p>mid)
upd((nod<<1)+1,mid+1,r,p,x);
v[nod]=maxim(v[(nod<<1)],v[(nod<<1)+1]);
}
void query(int nod,int l,int r,int a,int b){
if(a<=l&&r<=b){
sol=maxim(sol,v[nod]);
return;
}
int mid=(l+r)>>1;
if(a<=mid)
query((nod<<1),l,mid,a,b);
if(b>mid)
query((nod<<1)+1,mid+1,r,a,b);
}
int main(){
f=fopen("arbint.in","r");
g=fopen("arbint.out","w");
fscanf(f,"%d%d",&n,&m);
for(i=1;i<=n;i++){
fscanf(f,"%d",&x);
upd(1,1,n,i,x);
}
for(i=1;i<=m;i++){
fscanf(f,"%d",&op);
if(op==1){
fscanf(f,"%d%d",&p,&x);
upd(1,1,n,p,x);
}
else{
fscanf(f,"%d%d",&a,&b);
sol=0;
query(1,1,n,a,b);
fprintf(g,"%d\n",sol);
}
}
fclose(f);
fclose(g);
return 0;
}