Pagini recente » Cod sursa (job #890719) | Cod sursa (job #126907) | Cod sursa (job #1832552) | Cod sursa (job #2367513) | Cod sursa (job #3243849)
#include <bits/stdc++.h>
using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
const int NMAX=1e6;
int v[NMAX+1], n, m;
int max_p2;
void fenwick_build()
{
max_p2 = n;
while (max_p2 & (max_p2 - 1))
{
max_p2 &= max_p2 - 1;
}
for (int i = 1; i <= n; i++)
{
int j = i + (i & -i);
if (j <= n)
{
v[j] += v[i];
}
}
}
void fenwick_add(int pos, int val)
{
while(pos<=n)
{
v[pos] += val;
pos += pos & -pos;
}
}
int fenwick_sum(int pos)
{
int s = 0;
while (pos)
{
s += v[pos];
pos &= pos - 1;
}
return s;
}
int fenwick_range_sum(int from, int to)
{
return fenwick_sum(to) - fenwick_sum(from - 1);
}
int fenwick_bin_search(int sum)
{
int pos = 0;
for (int interval = max_p2; interval; interval >>= 1)
{
if ((pos + interval <= n) && (v[pos + interval] < sum))
{
sum -= v[pos + interval];
pos += interval;
}
}
return pos + 1;
}
int main()
{
in>>n>>m;
for(int i=1; i<=n; i++)
in>>v[i];
fenwick_build();
int op, x, y;
for(int i=1; i<=m; i++)
{
in>>op;
if(op==0)
{
in>>x>>y;
fenwick_add(x, y);
}
if(op==1)
{
in>>x>>y;
out<<fenwick_range_sum(x, y)<<'\n';
}
if(op==2)
{
in>>x;
out<<fenwick_bin_search(x)<<'\n';
}
}
}