Pagini recente » Cod sursa (job #2231626) | Cod sursa (job #3151515) | Cod sursa (job #3189820) | Cod sursa (job #1892463) | Cod sursa (job #2875523)
#include <fstream>
#include <cmath>
using namespace std;
ifstream cin("arbint.in");
ofstream cout("arbint.out");
//vector n numere
//m query uri de forma a b, la care trb sa afisezi cu max pe intervalul [a b] si queryuri de forma poz val(update);
const int NMAX=100001;
int max1[NMAX],ordinarynumbers[NMAX];
int rad,n;
int findstangainterval(int intervalindex)
{
return intervalindex*rad;
}
int finddreaptainterval(int intervalindex)
{
return min((intervalindex+1)*rad-1,n-1);
}
int findintervalindex(int vectorindex)
{
return vectorindex/rad;
}
int maxforinterval(int left, int right,int v[])
{
int rez=0;
for(int poz=left;poz<=right;poz++)
{
rez=max(rez,v[poz]);
}
return rez;
}
int query(int lf, int rg)
{
//lf...x....y....rg
int ans=0;
int firstinterval=findintervalindex(lf)+1;
int lastinterval=findintervalindex(rg)-1;
int lastoflfinterval=finddreaptainterval(findintervalindex(lf));
int firstofrginterval=findstangainterval(findintervalindex(rg));
if(lastoflfinterval>=rg)//daca rg si lf sunt in acelasi interval
{
return maxforinterval(lf,rg,ordinarynumbers);
}
ans=max(ans, maxforinterval(lf,lastoflfinterval,ordinarynumbers));
ans=max(ans, maxforinterval(firstofrginterval,rg, ordinarynumbers));
ans=max(ans, maxforinterval(firstinterval,lastinterval,max1));
return ans;
}
void update(int poz, int newval)
{
int intervalindex=findintervalindex(poz);
int st=findstangainterval(intervalindex);
int dr=finddreaptainterval(intervalindex);
ordinarynumbers[poz]=newval;
max1[intervalindex]=maxforinterval(st,dr,ordinarynumbers);
}
int main()
{
int q;
cin>>n>>q;
for(int i=0;i<n;i++)
{
cin>>ordinarynumbers[i];
}
rad=(int)sqrt(n);
for(int i=0;i*rad<n;i++)
{
int st=findstangainterval(i);
int dr=finddreaptainterval(i);
for(int j=st;j<=dr;j++)
{
max1[i]=max(max1[i],ordinarynumbers[j]);
}
}
for(int i=1;i<=q;i++)
{
int cer;
cin>>cer;
if(cer==0)
{
int rg,lf;
cin>>lf>>rg;
lf--;
rg--;
cout<<query(lf,rg)<<'\n';
}
else if(cer==1)
{
int poz,newval;
cin>>poz>>newval;
poz--;
update(poz,newval);
}
}
return 0;
}