#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define popcount __builtin_popcount using namespace std; typedef long long int ll; typedef pair P; template struct SegmentTreeDynamic{ using F=function; const F f; const Monoid e; struct Node{ Monoid x; Node *l, *r; Node(Monoid x):x(x), l(nullptr), r(nullptr){} }; Node *root; SegmentTreeDynamic(const F f, const Monoid &e):f(f), e(e), root(nullptr){} Node *update(Node *t, T k, const Monoid &x, T l, T r){ if(!t) t=new Node(e); if(r-l==1){ t->x=x; return t; } T m=(l+r)/2; if(kl=update(t->l, k, x, l, m); else t->r=update(t->r, k, x, m, r); t->x=f((t->l)?(t->l->x):e, (t->r)?(t->r->x):e); return t; } void update(T k, const Monoid &x){ root=update(root, k, x, kmn, kmx); } Monoid query(Node *t, T a, T b, T l, T r){ if(b<=l || r<=a) return e; if(!t) return e; if(a<=l && r<=b) return t->x; T m=(l+r)/2; return f(query(t->l, a, b, l, m), query(t->r, a, b, m, r)); } Monoid query(T l, T r){ return query(root, l, r, kmn, kmx); } }; int main() { int n; scanf("%d", &n); SegmentTreeDynamic seg([](int x, int y){ return x+y;}, 0); map a; ll ans=0; while(n--){ int t; scanf("%d", &t); if(t==0){ int x, y; scanf("%d %d", &x, &y); a[x]+=y; seg.update(x, a[x]); }else{ int l, r; scanf("%d %d", &l, &r); r++; ans+=seg.query(l, r); } } printf("%lld\n", ans); return 0; }