Pagini recente » Cod sursa (job #2854404) | Cod sursa (job #3176744) | Cod sursa (job #2477618) | Cod sursa (job #1087137) | Cod sursa (job #2198887)
#include <bits/stdc++.h>
#define NMAX 100005
using namespace std;
int aib[NMAX],n;
void update(int poz,int x)
{
for(int i=poz; i<=n; i+=(i&(-i)))
aib[i]+=x;
}
int query(int poz)
{
int sol=0;
for(int i=poz; i>0; i-=(i&(-i)))
sol+=aib[i];
return sol;
}
int squery(int sum)
{
int p=0,s=0;
for(int i=20; i>=0; i--)
{
if(p+(1<<i)>n)
continue;
if(s+aib[(1<<i)+p]<sum)
{
p+=(1<<i);
s+=aib[p];
}
}
if(query(p+1)==sum)
return p+1;
else
return -1;
}
int main()
{
ifstream cin("aib.in");
ofstream cout("aib.out");
int m,c;
cin>>n>>m;
for(int i=1; i<=n; i++)
{
cin>>c;
update(i,c);
}
int val,x,y;
for(int i=1; i<=m; i++)
{
cin>>val>>x;
if(val<2)
cin>>y;
if(val==0)
update(x,y);
if(val==1)
cout<<query(y)-query(x-1)<<"\n";
if(val==2)
cout<<squery(x)<<"\n";
}
return 0;
}