Pagini recente » Istoria paginii runda/arnold-testare-2/clasament | Cod sursa (job #1238001) | Cod sursa (job #55613) | Cod sursa (job #803051) | Cod sursa (job #356296)
Cod sursa(job #356296)
#include<fstream>
using namespace std;
int arb[280000],init[100005];
int n,x,y,tip,i,m;
inline int max(int a,int b)
{
if(a>b)
return a;
return b;
}
void cstr(int st,int dr,int poz)
{
if(st==dr)
{
init[st]=poz;
return ;
}
int mij=(st+dr)/2;
cstr(st,mij,2*poz);
cstr(mij+1,dr,(2*poz)+1);
}
void uptade(int pozitie,int val)
{
int k=init[pozitie];//se pare k init[pozitie] = vectorul in care sunt stocate frunzele
arb[k]=val;
for(k/=2;k>0;k/=2)
arb[k]=max(arb[2*k],arb[(2*k)+1]);
}
int caut(int st,int dr,int poz)
{
if(x<=st && dr<=y)
return arb[poz];
if(st>y || dr<x)
return 0;
int mij=(st+dr)/2;
return max(caut (st,mij,2*poz) , caut(mij+1,dr,2*poz+1));
}
int main()
{
ifstream in("arbint.in");
ofstream out("arbint.out");
in>>n; //n->lungimea sirului
in>>m; //m-> numarul de operatii
cstr(1,n,1);
//citire
for(i=1;i<=n;i++)
{
in>>x;
uptade(i,x);
}
// citim operatiile
// 0->adaugam element
// 1-> returnarea maximului pe interval
for(i=1;i<=m;i++)
{
in>>tip>>x>>y;
if(tip==0)
out<<caut(1,n,1)<<endl;
else
uptade(x,y);
}
return 0;
}