Pagini recente » Diferente pentru propuneri/6-arhiva-educationala intre reviziile 12 si 11 | Cod sursa (job #103898) | Cod sursa (job #201092) | Cod sursa (job #831277) | Cod sursa (job #173934)
Cod sursa(job #173934)
#include <fstream>
using namespace std;
const char iname[] = "aib.in";
const char oname[] = "aib.out";
#define FOR(i, a, b) for (int i = (a); i <= (b); ++ i)
#define MAXN 100005
#define ultbit(i) i & ~(i - 1)
int main(void)
{
ifstream fin(iname);
ofstream fout(oname);
int n, cnt, A[MAXN] = {0};
int val, p, type, a, b, sum, X, w;
fin >> n >> cnt;
FOR (i, 1, n) {
fin >> val;
for (p = i; p <= n; p += ultbit(p))
A[p] += val;
}
for (; cnt > 0; -- cnt)
{
fin >> type;
if (type == 0)
{
fin >> p >> val;
for (; p <= n; p += ultbit(p))
A[p] += val;
} else if (type == 1) {
fin >> a >> b;
for (sum = 0; b > 0; b -= ultbit(b))
sum += A[b];
for (a --; a > 0; a -= ultbit(a))
sum -= A[a];
fout << sum <<'\n';
} else if (type == 2) {
fin >> X;
for (int i = sum = 0, w = 1 << 16; w > 0; w >>= 1)
if (i + w <= n && sum + A[i + w] <= X)
sum += A[i + w],
i += w;
if (sum == X && X)
fout << i <<'\n';
else
fout << -1 <<'\n';
}
}
fin.close(), fout.close();
return 0;
}