Pagini recente » Cod sursa (job #1016876) | Cod sursa (job #185918) | Cod sursa (job #2895550) | Cod sursa (job #1907921) | Cod sursa (job #2961944)
#include<fstream>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
const int NMAX = 1e5 + 1;
int aib[NMAX],n;
inline int lsb(int x)
{
return (x & (-x));
}
void update(int p,int val)
{
for(int i = p ; i <= n ; i += lsb(i))
aib[i] += val;
}
int query(int a)
{
int ans = 0;
for(int i = a ; i > 0 ; i -= lsb(i))
ans += aib[i];
return ans;
}
void binar(int pref)
{
int st = 1,dr = n,ans = -1;
while(st <= dr)
{
int mid = st + (dr - st) / 2;
int cate = query(mid);
if(cate >= pref)
ans = mid,dr = mid - 1;
else st = mid + 1;
}
int rez = query(ans) == pref ? ans : -1;
fout << rez << '\n';
}
int main()
{
int t,a,b,q; fin >> n >> q;
for(int i = 1; i <= n ; i++) fin >> aib[i];
for(int i = 1; i <= n ; i++)
{
if(i + lsb(i) <= n)
aib[i + lsb(i)] += aib[i];
}
while(q--)
{
fin >> t;
if(t == 0)
{
fin >> a >> b;
update(a,b);
}
else if(t == 1)
{
fin >> a >> b;
fout << query(b) - query(a - 1) << '\n';
}
else
{
fin >> a;
binar(a);
}
}
}