Pagini recente » Cod sursa (job #329732) | Cod sursa (job #410929) | Cod sursa (job #2496844) | Cod sursa (job #1523387) | Cod sursa (job #2431399)
#include <fstream>
#include <cmath>
using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
int v[100001], n, m, x, y;
int buck[10000];
const int sq = 256;
inline int query1(int x, int y)
{
int poz = x, s = 0;
if (x / sq == y / sq)
{
for (int i = x; i <= y; ++i)
s += v[i];
return s;
}
int buck_st = x / sq, buck_dr = y / sq;
for (int i = x; i / sq == buck_st; ++i)
s += v[i];
for (int i = y; i / sq == buck_dr; --i)
s += v[i];
for (int i = buck_st + 1; i <= buck_dr - 1; ++i)
s += buck[i];
return s;
}
inline int cautbin(int x)
{
int pos, s = 0;
for (pos = 0; pos <= n / sq; ++pos)
{
s += buck[pos];
if (s >= x)
break;
}
int p = min((pos + 1) * sq - 1, n);
while (s != x && p)
s -= v[p--];
if (s != x)
return -1;
if (p > n)
return n;
return p;
}
int main()
{
int tip, a, b;
in >> n >> m;
for (int i = 1; i <= n; ++i)
{
in >> v[i];
buck[i / sq] += v[i];
}
for (int i = 1; i <= m; ++i)
{
in >> tip;
if (tip != 2)
{
in >> a >> b;
if (!tip)
{
v[a] += b;
buck[a / sq] += b;
}
else
out << query1(a, b) << '\n';
}
else
{
in >> a;
out << cautbin(a) << '\n';
}
}
return 0;
}