Pagini recente » Cod sursa (job #822400) | Cod sursa (job #1103024) | Cod sursa (job #343193) | Cod sursa (job #705905) | Cod sursa (job #3322273)
#include <fstream>
#include <iostream>
#include <vector>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int n, m;
vector<int> v;
void add(int x, int y)
{
for (int i = x; i <= n; i += (i & -i))
{
v[i] += y;
}
}
int sum(int x)
{
int cnt = 0;
for (int i = x; i >= 1; i -= (i & -i))
{
cnt += v[i];
}
return cnt;
}
int check(int k)
{
int st = 1;
int dr = n;
while (st <= dr)
{
int mij = (st + dr) / 2;
if (sum(mij) == k)
{
return mij;
}
else if (sum(mij) < k)
{
st = mij + 1;
}
else if (sum(mij) > k)
{
dr = mij - 1;
}
}
return -1;
// for (int i = 1; i <= n; i++)
// {
// if (sum(i) == k)
// {
// return i;
// }
// else if (sum(i) > k)
// {
// return -1;
// }
// }
// return -1;
}
int main()
{
fin >> n >> m;
v.resize(n + 1);
for (int i = 1; i <= n; i++)
{
int x;
fin >> x;
add(i, x);
}
for (int i = 0; i < m; i++)
{
int a;
fin >> a;
if (a == 0)
{
int b, c;
fin >> b >> c;
add(b, c);
}
else if (a == 1)
{
int b, c;
fin >> b >> c;
fout << sum(c) - sum(b - 1) << '\n';
}
else
{
int b;
fin >> b;
fout << check(b);
fout << '\n';
}
}
return 0;
}