Pagini recente » Cod sursa (job #2060528) | Rating Ungureanu Vlad (vladvlad23) | Cod sursa (job #1332043) | Cod sursa (job #136846) | Cod sursa (job #2415641)
#include <fstream>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
const int NMAX = 100000;
int N, M;
int aib[NMAX + 5];
inline int LastBit(int x)
{
return x & (-x);
}
void Update(int pos, int val)
{
for(int i = pos; i <= N; i += LastBit(i))
aib[i] += val;
}
int Query(int pos)
{
int ans = 0;
for(int i = pos; i > 0; i -= LastBit(i))
ans += aib[i];
return ans;
}
void Search(int x)
{
int c = 0;
for(int step = 16; step >= 0; step--)
if(c + (1 << step) <= N)
if(aib[c + (1 << step)] <= x)
{
x -= aib[c + (1 << step)];
c += (1 << step);
if(x == 0)
{
fout << c << '\n';
return ;
}
}
fout << -1 << '\n';
}
int main()
{
int t, x, y;
fin >> N >> M;
for(int i = 1; i <= N; i++)
{
fin >> x;
Update(i, x);
}
for(int i = 1; i <= M; i++)
{
fin >> t >> x;
if(t == 0)
{
fin >> y;
Update(x, y);
}
else if(t == 1)
{
fin >> y;
fout << Query(y) - Query(x - 1) << '\n';
}
else
Search(x);
}
return 0;
}