Pagini recente » Clasament | Cod sursa (job #3292970) | Cod sursa (job #3146245) | Cod sursa (job #3292265) | Cod sursa (job #3294996)
#include <bits/stdc++.h>
using namespace std;
void actualizare(int val, int poz, vector<int>&aib)
{
int n=aib.size()-1;
while(poz<=n)
{
aib[poz]+=val;
poz+=(poz&(-poz));
}
}
int interogare(int poz, vector<int>&aib)
{
int suma=0;
while(poz!=0)
{
suma+=aib[poz];
poz-=(poz&(-poz));
}
return suma;
}
int pozitie_maxima(int val, vector<int>&aib)
{
int n=aib.size()-1, p2=1;
while((p2<<1)<=n)
{
p2=(p2<<1);
}
int poz=0;
while(p2!=0)
{
if(poz+p2<=n && aib[poz+p2]<=val)
{
poz+=p2;
val-=aib[poz];
}
p2=(p2>>1);
}
return poz;
}
int main()
{
ifstream cin("aib.in");
ofstream cout("aib.out");
int n, m;
cin >> n >> m;
vector<int> aib(n+1, 0);
for(int i=1; i<=n; i++)
{
int val;
cin >> val;
actualizare(val, i, aib);
}
while(m--)
{
int operatie;
cin >> operatie;
if(operatie==0)
{
int a, b;
cin >> a >> b;
actualizare(b, a, aib);
}
else if(operatie==1)
{
int a, b;
cin >> a >> b;
cout << interogare(b, aib) - interogare(a-1, aib) << "\n";
}
else
{
int a;
cin >> a;
int poz=pozitie_maxima(a, aib);
if(poz==0 || a>interogare(poz, aib))
cout << -1 << "\n";
else
cout << poz << "\n";
}
}
return 0;
}