Pagini recente » Cod sursa (job #2682159) | Cod sursa (job #884634) | Cod sursa (job #1385082) | Cod sursa (job #2213459) | Cod sursa (job #2701031)
#include <bits/stdc++.h>
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
const int N = 10010;
int n,m,aib[N];
int suma(int i)
{
int rez=0;
for(; i; i-=i&(-i))
rez+=aib[i];
return rez;
}
void adun(int i,int val)
{
for(; i<=n; i+=i&(-i))
aib[i]+=val;
}
int main()
{
f>>n>>m;
for(int i=1; i<=n; i++)
{
int x;
f>>x;
adun(i,x);
}
for(; m; m--)
{
int tip;
f>>tip;
if(tip==0)
{
int i,x;
f>>i>>x;
adun(i,x);
}
else if(tip==1)
{
int st,dr;
f>>st>>dr;
g<<suma(dr)-suma(st-1)<<'\n';
}
else
{
int lo,hi,mi,val;
f>>val;
lo=0;hi=n;
while(hi-lo>1)
{
mi=(lo+hi)/2;
if(suma(mi)<val)
lo=mi;
else
hi=mi;
}
if(suma(hi)!=val)
hi=-1;
g<<hi<<'\n';
}
}
return 0;
}
//1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
//x x x x x x x x x x x x
//x x x x x x x x x x x x
//x x x x x x x x x x x x
//x x x x x x x x
//x x x x x x x x x x x x x x x x
//
//1110 ->14 4k*2 ( tai 2)
//1100 ->12 8k+4 (tai 4)
//1000 ->8
//0000 ->0
//21 1+20 10101
//20 4+16 10100
//16 16 10000
//0 00000
//
//celMaiMicBit(x) = x&(-x); /// !!!!!!!!!!!
//1010 10
// 10
// 1100 12
// 100
// 10000 16
// 10000
//100000 32>23