Mai intai trebuie sa te autentifici.
Cod sursa(job #1929659)
Utilizator | Data | 17 martie 2017 21:35:43 | |
---|---|---|---|
Problema | Arbori de intervale | Scor | 100 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.58 kb |
#include <stdio.h>
int m,n,p1,p2,temp;
bool as;
int a[100001],b[200001];
int maxim=0;
int x;
int maximum(int a,int b)
{
if(a>b) return a;
return b;
}
void place(int nod,int s,int e)
{
int mid=(s+e)/2;
if(s==e) b[nod]=a[x];
else if(s<=x&&x<=mid)
{
place(2*nod,s,mid);
b[nod]=maximum(b[2*nod],b[2*nod+1]);
}
else if(mid+1<=x&&x<=e)
{
place(2*nod+1,mid+1,e);
b[nod]=maximum(b[2*nod],b[2*nod+1]);
}
}
void gasire(int nod,int s,int e,int p1,int p2)
{
int mid=(s+e)/2;
if(s==p1&&p2==e)
{
if(maxim<b[nod]) maxim=b[nod];
}
else if(p1>=s&&p2<=mid) gasire(2*nod,s,mid,p1,p2);
else if(p1>=mid+1&&p2<=e) gasire(2*nod+1,mid+1,e,p1,p2);
else if(p1>=s&&p2>mid)
{
gasire(1,1,n,mid+1,p2);
gasire(2*nod,s,mid,p1,mid);
}
else if(p1<=mid+1&&p2<=e)
{
gasire(1,1,n,p1,mid);
gasire(2*nod+1,mid+1,e,p1,p2);
}
}
int main()
{
FILE *fin,*fout;
fin=fopen("arbint.in","r");
fout=fopen("arbint.out","w");
fscanf(fin,"%d %d",&n,&m);
for(x=1;x<=n;x++)
{
fscanf(fin,"%d",&a[x]);
place(1,1,n);
}
for(int i=0;i<m;i++)
{
fscanf(fin,"%d %d %d",&as,&p1,&p2);
if(as==0)
{
maxim=0;
gasire(1,1,n,p1,p2);
fprintf(fout,"%d",maxim);
fprintf(fout,"\n");
}
else if(as==1)
{
x=p1;
temp=a[x];
a[x]=p2;
place(1,1,n);
}
}
}