Pagini recente » Monitorul de evaluare | Cod sursa (job #2122571) | Cod sursa (job #2270641) | Istoria paginii runda/simulare-cartita-33 | Cod sursa (job #1218764)
#include <cstdio>
#define Nmax 100005
#define nextp ((p^(p-1))&p)
using namespace std;
#define DIM 10666
int poz = DIM - 1;
char buff[DIM];
void scan(int &A)
{
A = 0;
while('0' > buff[poz] || buff[poz] >'9')
if(++poz == DIM) fread(buff,1,DIM,stdin),poz=0;
while('0' <= buff[poz] && buff[poz] <= '9')
{
A = A * 10 + buff[poz] - 48;
if(++poz == DIM) fread(buff,1,DIM,stdin),poz=0;
}
}
int N,M,a,b,op;
class FenwickTree{
private:
int range[Nmax];
int answer;
public:
void Update(int pz,int val)
{
for(int p = pz; p <= N; p += nextp)
range[p] += val;
}
int Querry(int pz)
{
int answer = 0;
for(int p = pz; p; p -= nextp)
answer += range[p];
return answer;
}
}Aib;
int main()
{
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
scan(N);scan(M);
for(int i = 1; i <= N; ++i){
scan(a);
Aib.Update(i,a);
}
for(int i = 1; i <= M; ++i)
{
scan(op);
if(op == 0)
{
scan(a),scan(b);
Aib.Update(a,b);
}
else
if(op == 1)
{
scan(a),scan(b);
printf("%d\n",Aib.Querry(b) - Aib.Querry(a-1));
}
else
{
int li = 1,lf = N,m,done = 0;
scan(a);
while(li <= lf)
{
m = li + ((lf - li) >> 1);
int x = Aib.Querry(m);
if(x == a){
printf("%d\n",m);
done = 1;
}
if(x > a)
lf = m - 1;
else
li = m + 1;
}
if(done) continue;
printf("-1\n");
}
}
return 0;
}