Pagini recente » Cod sursa (job #2754048) | Monitorul de evaluare | Cod sursa (job #1005395) | Cod sursa (job #2276678) | Cod sursa (job #1480956)
#include <fstream>
#include <bitset>
#define LSB(x) x&(-x)
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
int n,m,a,b,i,c,L,R,M,x[100010],query(int);
void upd(int,int);
int main()
{
f>>n>>m;
for(i=1;i<=n;i++)
{
f>>a;
upd(i,a);
}
for(;m;m--)
{
f>>c>>a;
if(c==0)
{
f>>b;
upd(a,b);
continue;
}
if(c==1)
{
f>>b;
g<<query(b)-query(a-1)<<"\n";
continue;
}
if(query(n)<a)
{
g<<"-1\n";
continue;
}
L=0;R=n;
for(;R-L-1;)
{
M=(R+L)/2;
if(query(M)<a)L=M;
else R=M;
}
if(query(R)>a)
{
g<<"-1\n";
continue;
}
g<<R<<"\n";
}
return 0;
}
void upd(int poz,int val)
{
for(;poz<=n;poz+=LSB(poz))
x[poz]+=val;
}
int query(int poz)
{
int ret=0;
for(;poz;poz-=LSB(poz))
ret+=x[poz];
return ret;
}