Pagini recente » Cod sursa (job #1896085) | Cod sursa (job #1219147) | Cod sursa (job #2092259) | Cod sursa (job #1898285) | Cod sursa (job #3345782)
#include <bits/stdc++.h>
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
int v[100005], sp[100005];
int n, m;
void update(int st, int x)
{
for(int i=st; i<=n; i+=(i&-i))
sp[i]+=x;
}
int query(int x)
{
int sum=0;
for(int i=x; i>0; i-=(i&-i))
sum+=sp[i];
return sum;
}
int cb(int x)
{
int st=1, dr=n;
while(st<=dr)
{
int mij=(st+dr)/2;
int val=query(mij);
if(val>x)
dr=mij-1;
else if(val<x)
st=mij+1;
else
return mij;
}
return -1;
}
void create()
{
for(int i=1; i<=n; i++)
for(int j=i; j<=n; j+=(j&-j))
sp[j]+=v[i];
}
int main()
{
f >> n >> m;
for(int i=1; i<=n; i++)
f >> v[i];
create();
for(int i=1; i<=m; i++)
{
int tip, a, b;
f >> tip >> a;
if(tip<=1)
f >> b;
if(tip==0)
{
update(a, b);
}
else if(tip==1)
{
g << query(b)-query(a-1) << '\n';
}
else
{
g << cb(a) << '\n';
}
}
return 0;
}