Pagini recente » Cod sursa (job #2353885) | Monitorul de evaluare | Cod sursa (job #1005850) | Cod sursa (job #70941) | Cod sursa (job #2513784)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
inline int nrz(int x)
{
return ((x^(x-1))&x);
}
ifstream in ("aib.in");
ofstream out("aib.out");
int n, m;
vector <int> aib;
vector <int> a;
int caz, x, y;
void add(int x, int y)
{
a[x]+=y;
for(int i=x; i<=n; i+=nrz(i))
aib[i]+=y;
}
int suma(int x)
{
int s=0;
for(int i=x; i>0; i-=nrz(i))
s+=aib[i];
return s;
}
int cauta(int val)
{
if(val==0) return -1;
int step;
for(step=1; step<=n; step<<=1);
for(int i=0; step; step>>=1)
{
if(i+step<=n)
if(aib[i+step]<=val)
{
val-=aib[i+step];
i+=step;
if(!val) return i;
}
}
return -1;
}
int main()
{
in>>n>>m;
a.resize(n+2, 0);
aib.resize(n+2, 0);
for(int i=1; i<=n; i++)
in>>x, add(i, x);
for(int i=1; i<=m; i++)
{
in>>caz;
if(caz==0)
{
in>>x>>y;
add(x, y);
}
else if(caz==1)
{
in>>x>>y;
out<<suma(y)-suma(x-1)<<"\n";
}
else
{
in>>x;
out<<cauta(x)<<"\n";
}
}
return 0;
}