Pagini recente » Cod sursa (job #818406) | Cod sursa (job #1220290) | Cod sursa (job #1693278) | Cod sursa (job #992008) | Cod sursa (job #3178525)
#include <bits/stdc++.h>
#define SIZE 100005
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
int n,v[SIZE],aib[SIZE];
void update(int poz,int val)
{
int i;
for(i=poz;i<=n;i+=i&-i)
aib[i]+=val;
}
int querysum(int poz)
{
int i,sum=0;
for(i=poz;i>=1;i-=i&-i)
sum+=aib[i];
return sum;
}
int sol(int s)
{
int p=1,i=0,ok=0;
while(p<=n)p*=2;
p/=2;
while(p>=1)
{
if(aib[i+p]==s)ok=1;
if(aib[i+p]<s)
{
s-=aib[i+p];
i+=p;
}
p/=2;
while(p>=1 && i+p>n)p/=2;
}
if(ok==1)return i+1;
return -1;
}
int main()
{
int m,i,a,b,x,s;
f>>n>>m;
for(i=1;i<=n;i++)
{
f>>v[i];
update(i,v[i]);
}
for(i=1;i<=m;i++)
{
f>>x;
if(x==0)
{
f>>a>>b;
update(a,b);
}
else if(x==1)
{
f>>a>>b;
s=querysum(b)-querysum(a-1);
g<<s<<'\n';
}
else
{
f>>a;
g<<sol(a)<<'\n';
}
}
}