Pagini recente » Cod sursa (job #1058543) | Cod sursa (job #1067741) | Cod sursa (job #1897344) | Cod sursa (job #2136220) | Cod sursa (job #440890)
Cod sursa(job #440890)
#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 && query(j+s)<=val)
j+=s;
return j;
}
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);
T=binary_search(v1);
if( query(T) == v1)
printf("%d\n",T);
else printf("-1\n");
}
}
return 0;
}