Cod sursa(job #2069960)

Utilizator cojocarugabiReality cojocarugabi Data 19 noiembrie 2017 00:23:45
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.86 kb
#include "bits/stdc++.h"
using namespace std;
#define fi first
#define se second
#define ll long long
#define dbg(v) cerr<<#v<<" = "<<v<<'\n'
#define vi vector<int>
#define vl vector <ll>
#define pii pair<int,int>
#define mp make_pair
#define db long double
#define pb push_back
#define all(s) s.begin(),s.end()
template < class T > T smin(T &a,T b) {if (a > b) a = b;return a;}
template < class T > T smax(T &a,T b) {if (a < b) a = b;return a;}
const int N = (int)(1e6) + 5;
class DSU
{
    public:
    int * f;
    int * sz;
    stack < pair < int* , int > > v;
    public:
    void init(int n)
    {
        f = new int[n + 5];
        sz = new int[n + 5];
        for (int i = 0;i < n + 5;++i)
            f[i] = 0;
        for (int i = 1;i <= n;++i)
            f[i] = i,sz[i] = 1;
    }
    int get(int k)
    {
        return k == f[k] ? k : get(f[k]);
    }
    void go(int &a,int b)
    {
        v.push({&a,a});
        return void(a = b);
    }
    void U(int a,int b)
    {
        a = get(a);b = get(b);
        if (a == b) return;
        if (sz[a] > sz[b])
            swap(a,b);
        go(f[a],b);
        go(sz[b],sz[a] + sz[b]);
    }
    void Restore(int Size)
    {
        while (v.size() > Size)
        {
            *v.top().fi = v.top().se;
            v.pop();
        }
    }
};
template < class T >
class Fenwick
{
    public:
    T * t;
    function < T(T,T) > comb;
    int n;
    public:
    void init(int N,T v,function < T(T,T) > cc)
    {
        n = N;
        t = new T[n + 5];
        for (int i = 0;i < n + 5;++i)
            t[i] = v;
        comb = cc;
    }
    T query(int i)
    {
        int ans = t[i];
        for (i -= i&(-i);i;i -= i&(-i))
            ans = comb(ans,t[i]);
        return ans;
    }
    void update(int i,T v)
    {
        for (;i <= n;i += i&(-i))
            t[i] = comb(t[i],v);
    }
};
int main(void)
{
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    int n,m;
    scanf("%d%d",&n,&m);
    Fenwick < int > tr;
    tr.init(n,0,[&](int a,int b) {return (a + b);});
    for (int i = 1;i <= n;++i)
    {
        int v;
        scanf("%d",&v);
        tr.update(i,v);
    }
    while (m --)
    {
        int op;
        scanf("%d",&op);
        if (!op)
        {
            int a,b;
            scanf("%d%d",&a,&b);
            tr.update(a,b);
        }
        else
        if (op == 1)
        {
            int a,b;
            scanf("%d%d",&a,&b);
            printf("%d\n",tr.query(b) - tr.query(a - 1));
        }
        else
        {
            int v;
            scanf("%d",&v);
            int ans = 0;
            for (int t = 1 << 17;t;t /= 2)
                if (ans + t <= n && tr.query(ans + t) < v)
                    ans += t;
            ans = min(n,ans + 1);
            if (tr.query(ans) == v)
                printf("%d\n",ans);
            else
                printf("-1\n");
        }
    }
    return 0;
}