Pagini recente » Cod sursa (job #1573933) | Cod sursa (job #2810860) | Cod sursa (job #3196690) | Cod sursa (job #2532492) | Cod sursa (job #2877048)
#include <bits/stdc++.h>
using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
const int N=1e5;
int v[N+5],aib[N+5];
int n;
inline int lsb(int x)
{
return x & (-x);
}
void Update(int pos,int val)
{
v[pos]+=val;
for(int i=pos;i<=n;i+=lsb(i))
aib[i]+=val;
}
int Sum(int pos)
{
int rez=0;
for(int i=pos;i>=1;i-=lsb(i))
rez+=aib[i];
return rez;
}
int Query(int val)
{
int st=1,dr=n,poz;
while(st<=dr)
{
int mij=(st+dr)/2;
if(Sum(mij) <= val) st=mij+1,poz=mij;
else dr=mij-1;
}
if(Sum(poz) == val) return poz;
return -1;
}
int main()
{
int m; in>>n>>m;
for(int i=1;i<=n;i++)
{
in>>v[i];
Update(i,v[i]);
}
for(int i=1;i<=m;i++)
{
int q;in>>q;
switch (q)
{
case 0:
{
int a,b; in>>a>>b;
Update(a,b);
break;
}
case 1:
{
int a,b;in>>a>>b;
out<<Sum(b)-Sum(a-1)<<'\n';
break;
}
case 2:
{
int x;in>>x;
out<<Query(x)<<'\n';
break;
}
}
}
return 0;
}