Mai intai trebuie sa te autentifici.
Cod sursa(job #261505)
Utilizator | Data | 18 februarie 2009 13:12:15 | |
---|---|---|---|
Problema | Arbori indexati binar | Scor | 0 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.41 kb |
#include<stdio.h>
int a[100005],b[100005];
int n,m;
int stop;
/*void adunare()
{
}*/
void actualizare(int i,int x)
{int j;
for(j=i;j<=n;j++)
b[j]+=x;
}
void suma(int i,int j)
{
printf("%d \n",(b[j]-b[i-1]));
}
void apoz(int k,int i,int j)
{if(stop==0){
if(i==j)
{if(b[i]==k) {printf("%d \n",i);stop=1;}
}
else
{int med=(i+j)/2;
if(b[med]==k) {printf("%d \n",med);stop=1;}
else if(k<b[med])
{
apoz(k,i,med);
}
else
apoz(k,med,j);
}
}
}
void poz(int k)
{int i,ok=0;
for(i=1;i<n;i+=2)
{ if(b[i]==k)
{printf("%d \n",i);ok=1;}
if(b[i]>k)
{if(b[i-1]==k)
{printf("%d \n",i-1);ok=1;}
break;
}
}
if(ok==0&&b[n]==k)
{printf("%d \n",n);ok=1;
}
if(ok==0)
printf("-1 \n");
}
int main()
{int i;
int x,y,z;
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
scanf("%d %d",&n,&m);
scanf("%d",&x);
a[1]=x;
b[1]=x;
for(i=2;i<=n;i++)
{scanf("%d",&x);
a[i]=x;
b[i]+=b[i-1]+x;
}
for(i=0;i<m;i++)
{
scanf("%d",&x);
if(x==0)
{scanf("%d %d",&y,&z);
actualizare(y,z);
}
if(x==1)
{ scanf("%d %d",&y,&z);
suma(y,z);
}
if(x==2)
{scanf("%d",&y);
stop=0;
apoz(y,1,n);
}
}
/* printf("\n");
for(i=1;i<n;i++)
printf("%d ",a[i]);
printf("\n");
for(i=1;i<n;i++)
printf("%d ",b[i]);
*/
return 0;
}