Pagini recente » Cod sursa (job #2431310) | Cod sursa (job #896394) | Cod sursa (job #2538390) | Cod sursa (job #1846433) | Cod sursa (job #440893)
Cod sursa(job #440893)
#include<stdio.h>
int n,m,v1,v2,c[100005],i,type,T;
void update(int ind, int val)
{
int poz=0;
while(ind<=n)
{
c[ind]+=val;
while( !(ind & (1<<poz) ) )
poz++;
ind += (1<<poz);
poz++;
}
}
int query(int ind)
{
int poz=0,S=0;
while(ind>0)
{
S+=c[ind];
while ( !(ind & (1<<poz) ) )
poz++;
ind -= (1<<poz);
poz++;
}
return S;
}
int binary_search(int val)
{
int j,s;
for(s=1;s<n;s<<=1);
for(j=0;s;s>>=1)
if(j+s<=n && c[j+s]<=val)
{
j+=s;
val-=c[j];
if(!val)return j;
}
return -1;
}
int main()
{
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
scanf("%d %d",&n,&m);
for(i=1;i<=n;i++)
{
scanf("%d",&v1);
update(i,v1);
}
for(i=1;i<=m;i++)
{
scanf("%d",&type);
if(type==0)
{
scanf("%d %d",&v1,&v2);
update(v1,v2);
}
if(type==1)
{
scanf("%d %d",&v1,&v2);
T=query(v2)-query(v1-1);
printf("%d\n",T);
}
if(type==2)
{
scanf("%d",&v1);
printf("%d\n",binary_search(v1));
}
}
return 0;
}