Mai intai trebuie sa te autentifici.
Cod sursa(job #331560)
| Utilizator | Data | 14 iulie 2009 15:07:49 | |
|---|---|---|---|
| Problema | Arbori de intervale | Scor | 100 |
| Compilator | cpp | Status | done |
| Runda | Arhiva educationala | Marime | 0.95 kb |
#include<fstream>
#define MaxN 100005
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int arb[3*MaxN];
int i,Max,op,a,b,n,m;
void update(int nod, int st, int dr, int poz, int val)
{ if(st==dr)
arb[nod]=val;
else
{ int mij=(st+dr)/2;
if(poz<=mij)
update(2*nod,st,mij,poz,val);
else
update(2*nod+1,mij+1,dr,poz,val);
arb[nod]=max(arb[2*nod],arb[2*nod+1]);
}
}
void query(int nod, int st, int dr, int in, int sf)
{ if(st>=in&&dr<=sf)
{ if(arb[nod]>Max)
Max=arb[nod];
}
else
{ int mij=(st+dr)/2;
if(in<=mij)
query(2*nod,st,mij,in,sf);
if(sf>mij)
query(2*nod+1,mij+1,dr,in,sf);
}
}
int main()
{ fin>>n>>m;
for(i=1;i<=n;i++)
{ fin>>a;
update(1,1,n,i,a);
}
for(i=1;i<=m;i++)
{ fin>>op;
if(op==0)
{ fin>>a>>b;
Max=-1;
query(1,1,n,a,b);
fout<<Max<<'\n';
}
if(op==1)
{ fin>>a>>b;
update(1,1,n,a,b);
}
}
return 0;
}
