Pagini recente » Cod sursa (job #2622071) | Cod sursa (job #2384933) | Cod sursa (job #251072) | Cod sursa (job #2374344) | Cod sursa (job #1453339)
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
const int NSIZE = 100000 + 10;
int x , i , N , le , ri , mid , s , type , M , p , a , b , f , crt;
class fenwick
{
public :
int aib[NSIZE];
void init()
{
memset(aib,0,sizeof(aib));
}
int sum(int p)
{
int i , res = 0;
for (i = p ; i > 0 ; i -= i & (-i))
res += aib[i];
return res;
}
void update(int x,int p)
{
int i;
for (i = p ; i <= N ; i += i & (-i))
aib[i] += x;
}
};
fenwick aib;
int main()
{
fin >> N >> M;
aib.init();
for (i = 1 ; i <= N ; ++i)
{
fin >> x;
aib.update(x,i);
}
for (i = 1 ; i <= M ; ++i)
{
fin >> type;
if (type == 0)
{
fin >> p >> x;
aib.update(x,p);
}
if (type == 1)
{
fin >> a >> b;
fout << aib.sum(b) - aib.sum(a-1) << '\n';
}
if (type == 2)
{
fin >> s;
f = N + 1;
le = 1 , ri = N;
while (le <= ri)
{
mid = (le + ri) >> 1;
crt = aib.sum(mid);
if (crt == s)
f = min(f , mid);
if (crt >= s)
ri = mid - 1;
else le = mid + 1;
}
if (f == N + 1) fout << "-1" << '\n';
else fout << f << '\n';
}
}
return 0;
}