Advertisement
Guest User

chef and churu

a guest
Nov 18th, 2014
255
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.90 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <cmath>
  5.  
  6. typedef long long ll;
  7.  
  8. using namespace std;
  9.  
  10. int n,m,q,N,l[100009],r[100009],x[320][100004],nn,a[100009];
  11. ll t[4 * 100009],b[320],csum[100009];
  12.  
  13. void build(int v,int tl,int tr) {
  14.     if (tl == tr) t[v] = a[tl];
  15.     else {
  16.         int tm = (tl + tr) / 2;
  17.         build(v * 2,tl,tm);
  18.         build(v * 2 + 1,tm + 1,tr);
  19.         t[v] = t[v * 2] + t[v * 2 + 1];
  20.     }
  21. }
  22. void upd(int v,int tl,int tr,int pos,int val) {
  23.     if (tl == tr) t[v] = val;
  24.     else {
  25.         int tm = (tl + tr) / 2;
  26.         if (pos <= tm)
  27.             upd(v * 2,tl,tm,pos,val);
  28.         else
  29.             upd(v * 2 + 1,tm + 1,tr,pos,val);
  30.  
  31.         t[v] = t[v * 2] + t[v * 2 + 1];
  32.     }
  33. }
  34. ll getsum(int v,int tl,int tr,int L,int R) {
  35.     if (L > tr || tl > R) return 0;
  36.     if (L <= tl && tr <= R) return t[v];
  37.     int tm = (tl + tr) / 2;
  38.     return getsum(v * 2,tl,tm,L,R) + getsum(v * 2 + 1,tm + 1,tr,L,R);
  39. }
  40.  
  41. ll get(int L,int R) {
  42.     ll ret = 0;
  43.     for (int i = L; i <= R;) {
  44.        
  45.         if ( i % N == 0  && i + N - 1 <= R ) {
  46.             ret += b[i/N];
  47.             i += N;
  48.             //printf("%d %I64d\n",i,ret);
  49.             continue;
  50.         }
  51.         else ret += getsum(1,1,n,l[i],r[i]),i++;
  52.  
  53.         //printf("%d %I64d\n",i,ret);
  54.     }  
  55.     return ret;
  56. }
  57. int main()
  58. {
  59.     //freopen("input.txt","r",stdin);
  60.     //freopen("output.txt","w",stdout);
  61.  
  62.     int q,L,R;
  63.  
  64.     cin >> n;
  65.     for (int i = 1; i <= n; i++) {
  66.         cin >> a[i];
  67.         csum[i] = csum[i-1] + a[i];
  68.     }
  69.     build(1,1,n);  
  70.  
  71.     N = (int)sqrt(n + .0);
  72.     for (int i = 1; i <= n; i++ ) {
  73.         cin>> l[i] >> r[i];
  74.         //l[i]--; r[i]--;
  75.         b[i / N] += csum[r[i]] - csum[l[i]-1];
  76.         x[i / N][l[i]]++;
  77.         x[i / N][r[i]+1]--;
  78.     }
  79.     for (int i = 0; i <= n / N; i++)
  80.         for (int j = 1; j <= n; j++)
  81.             x[i][j] += x[i][j-1];
  82.  
  83.     cin >> m;
  84.     while(m--) {
  85.         scanf("%d%d%d",&q,&L,&R);
  86.         if (q == 1) {
  87.             upd(1,1,n,L,R);
  88.            
  89.             for (int i = 0; i <= n / N; i++)
  90.                 b[i] += x[i][L] * (R - a[L]);
  91.             a[L] = R;
  92.         }
  93.         else printf("%I64d\n",get(L,R));
  94.     }
  95. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement