Pagini recente » Cod sursa (job #2406534) | Cod sursa (job #1593268) | Cod sursa (job #197483) | Cod sursa (job #1311833) | Cod sursa (job #2431273)
#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;
}
while (x % sq != 0)
s += v[x++];
while (y % sq != 0)
s += v[y--];
for (; x < y; x += sq)
s += buck[x / sq];
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, 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;
}