Pagini recente » Monitorul de evaluare | Cod sursa (job #1680726) | Cod sursa (job #1662593) | Cod sursa (job #1689660) | Cod sursa (job #874671)
Cod sursa(job #874671)
#include <iostream>
#include <fstream>
using namespace std;
ifstream in ("aib.in");
ofstream out ("aib.out");
int N;
int AIB[1 << 17];
inline int lsb (const int &X)
{
return X & (-X);
}
inline void update (int poz, int val)
{
for ( ; poz <= N; poz += lsb (poz))
AIB[poz] += val;
}
inline int query (int poz)
{
int Ans = 0;
for ( ; poz; poz -= lsb (poz))
Ans += AIB[poz];
return Ans;
}
inline int BS (int val)
{
int i = 0, step;
for (step = 1; step <= N; step <<= 1);
for ( ; step; step >>= 1)
if (i + step <= N && query (i + step) <= val)
i += step;
if (query (i) == val)
return i;
else
return -1;
}
int main()
{
int Q, i, tip, x, y;
in >> N >> Q;
for (i = 1; i <= N; i ++){
in >> x;
update (i, x);
}
while (Q --){
in >> tip;
if (!tip)
in >> x >> y, update (x, y);
if (tip == 1)
in >> x >> y, out << query (y) - query (x - 1) << "\n";
if (tip == 2)
in >> x, out << BS (x) << "\n";
}
return 0;
}