Pagini recente » Cod sursa (job #704552) | Cod sursa (job #705780) | Cod sursa (job #2534992) | Cod sursa (job #896074) | Cod sursa (job #1364446)
#include <cstdio>
#include <vector>
#define DIM 66013
#define nextp p&(p^(p-1))
using namespace std;
char buffer[DIM];
int poz = DIM - 1;
void Scanf(int &A){
A = 0;
while('0' > buffer[poz] || buffer[poz] > '9')
if(++poz == DIM)
fread(buffer,1,DIM,stdin),poz = 0;
while('0' <= buffer[poz] && buffer[poz] <= '9')
{
A = A * 10 + buffer[poz] - 48;
if(++poz == DIM)
fread(buffer,1,DIM,stdin),poz = 0;
}
}
int N,M;
class FenwickTree{
public:
vector<int> range;
int answer;
void Resize(int N){
range.resize(N+1);
}
void Update(int pz,int val){
for(int p = pz; p <= N; p += nextp)
range[p] += val;
}
int Querry(int pz){
answer = 0;
for(int p = pz; p; p -= nextp)
answer = answer + range[p];
return answer;
}
};
FenwickTree AIB;
void Read()
{
Scanf(N);Scanf(M);
AIB.Resize(N+1);
int v;
for(int i = 1; i <= N; ++i){
Scanf(v);
AIB.Update(i,v);
}
}
void Solve()
{
int t,a,b;
for(int i = 1; i <= M; ++i)
{
Scanf(t);
if(t == 0){
Scanf(a);Scanf(b);
AIB.Update(a,b);
continue;
}
if(t == 1){
Scanf(a);Scanf(b);
printf("%d\n",AIB.Querry(b) - AIB.Querry(a-1));
continue;
}
Scanf(a);
int li = 1,lf = N,m;
while(li <= lf){
m = li +((lf-li) >> 1);
if(AIB.Querry(m) >= a)
lf = m - 1;
else
li = m + 1;
}
if(AIB.Querry(li) == a)
printf("%d\n",li);
else
printf("-1\n");
}
}
int main()
{
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
Read();
Solve();
return 0;
}