Pagini recente » Cod sursa (job #2529742) | Cod sursa (job #527380) | Cod sursa (job #2607333) | Rating Bobe Petrica (petiti) | Cod sursa (job #3159426)
#include <bits/stdc++.h>
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
const int N = 100010;
int n,q,aib[N];
void add(int poz,int val)
{
for(int i=poz;i<=n;i+=i&(-i))
aib[i]+=val;
}
int suma(int poz)
{
int sum=0;
for(int i=poz;i;i-=i&(-i))
sum+=aib[i];
return sum;
}
int suma(int st,int dr)
{
return suma(dr)-suma(st-1);
}
int main()
{
f>>n>>q;
for(int i=1;i<=n;i++)
{
int x;
f>>x;
add(i,x);
}
for(;q;q--)
{
int tip;
f>>tip;
if(tip==0)
{
int poz,val;
f>>poz>>val;
add(poz,val);
}
else if(tip==1)
{
int st,dr;
f>>st>>dr;
g<<suma(st,dr)<<'\n';
}
else
{
int sum;
f>>sum;
int lo=0,hi=n,mi;
while(hi-lo>1)
{
mi=(lo+hi)/2;
if(suma(mi)<sum)
lo=mi;
else
hi=mi;
}
if(suma(hi)==sum)
g<<hi<<'\n';
else
g<<"-1\n";
}
}
return 0;
}
//8 6
//0 1 2 3 4 5 6 7 8
//0 25 42 8 15 1 55 16 67 v
// * * * *
// * * * *
// * * * *
// * * * * * * * *
// 1-> 1 2 4 8 ....
// 2-> 2 4 8
// 3-> 3 4 8
// 4-> 4 8
// 5-> 5 6 8 5+1=6;6+2=8 8+8=16 prea mare
// 6-> 6 8
// 7-> 7 8
// 8-> 8
//// a1 a2 a3 a4 a5 a6 a7 a8
//// s1=a1 1
//// s2=a2 2
//// s3=a3+a2 1+2
//// s4=a4 4
//// s5=a5+a4 1+4
//// s6=a6+a4 2+4
//// s7=a7+a6+a4 1+2+4 2+4 4 0
//// s8=a8 8
////
//// 43 = 1 + 2 + 8 + 32 43
//// 42 = 2 + 8 + 32 41-42
//// 40 = 8 + 32 33-40
//// 32 = 32 1 -32
//// 0
//// lsb(x)=x&(-x)
//5=1+4 -> 5+1=6=2+4
//6=2+4 -> 2+2+4=4+4=8
//43 = 1+2+8+32
//44 = 4+8+32
//48 = 16+32
//64 = 64
//128 = 64+64 > n = 100