Pagini recente » Cod sursa (job #1680725) | Diferente pentru problema/tablite intre reviziile 35 si 13 | Cod sursa (job #1387142) | Cod sursa (job #286578) | Cod sursa (job #874672)
Cod sursa(job #874672)
#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 = N, step;
for (step = 1; step <= N; step <<= 1);
for ( ; step; step >>= 1)
if (i - step >= 1 && 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;
}