Pagini recente » Cod sursa (job #2137781) | Cod sursa (job #493901) | Cod sursa (job #1139674) | Cod sursa (job #3214404) | Cod sursa (job #371707)
Cod sursa(job #371707)
#include<stdio.h>
#include<vector>
using namespace std;
int n,m;
vector <int> aib;
void Update(int ind,int val)
{
int poz=0;
do
{
aib[ind]+=val;
while(!(ind&(1<<poz)))
poz++;
ind+=(1<<poz);
poz++;
}while(ind<=n);
}
int GetSum(int ind)
{
int poz=0,sum=0;
do
{
sum+=aib[ind];
while(!(ind&(1<<poz)))
poz++;
ind-=(1<<poz);
poz++;
}while(0<ind);
return sum;
}
int PozMin(int sum)
{
int i,step;
for(step=1;step<n;step<<=1);
for(i=0;step;step>>=1)
if(i+step<=n&&aib[i+step]<=sum)
{
i+=step;
sum-=aib[i];
if(!sum)
return i;
}
return -1;
}
int main()
{
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
scanf("%d%d",&n,&m);
aib.resize(n+1,0);
for(int i=1;i<=n;i++)
{
int x;
scanf("%d",&x);
Update(i,x);
}
for(;m;m--)
{
int x,y,z;
scanf("%d",&x);
if(x==0||x==1)
{
scanf("%d%d",&y,&z);
if(x==0)
{
Update(y,z);
}
else
printf("%d\n",GetSum(z)-GetSum(y-1));
continue;
}
scanf("%d",&y);
printf("%d\n",PozMin(y));
}
return 0;
}