Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- #include<ext/pb_ds/assoc_container.hpp>
- #include<ext/pb_ds/tree_policy.hpp>
- using namespace __gnu_pbds;
- #define LagaKar ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL)
- #define pb push_back
- #define pf push_front
- #define pob pop_back
- #define pof pop_front
- #define mp make_pair
- #define fi first
- #define se second
- #define lb lower_bound
- #define ub upper_bound
- #define ook order_of_key //number of elements less than k
- #define fbo find_by_order //k th element
- #define nline "\n"
- #define YES cout<<"YES"<<nline
- #define NO cout<<"NO"<<nline
- #define Yes cout<<"Yes"<<nline
- #define No cout<<"No"<<nline
- //--------------------------------------------------------------------------------------------------------------
- #define precise(ans) cout<<fixed<<setprecision(15)<<ans
- #define fo(i,n) for(ll i=0;i<n;i++)
- #define Fo(i,k,n) for(ll i=k;k<n?i<n:i>n;k<n?i+=1:i-=1)
- #define tr(it, a) for(auto it = a.begin(); it != a.end(); it++)
- #define sz(x) ((ll)(x).size())
- #define all(x) x.begin(), x.end()
- #define MAX(x) *max_element(all(x))
- #define MIN(x) *min_element(all(x))
- #define SUM(x) accumulate(all(x), 0LL)
- #define CNT(x) __builtin_popcountll(x)
- //--------------------------------------------------------------------------------------------------------------
- typedef long long ll; typedef unsigned long long ull; typedef long double lld;
- template <typename T> using o_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
- template <typename T, typename R> using o_map = tree<T, R, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
- typedef pair<ll, ll> pl; typedef vector<ll> vl;typedef vector<vl> vvl;
- typedef vector<pl> vpl; template <typename T> using prq_mx = priority_queue<T>;
- template <typename T> using prq_mn = priority_queue<T, vector<T>, greater<T>>;
- //------------------------------------------------------------------------------------------------------------
- #ifdef hydracody
- #include <C:\Users\Anurag Dwivedi\Desktop\cpc\debug.h>
- #else
- #define debug(x)
- #endif
- //------------------------------------------------------------------------------------------------------------
- const double eps=1e-9;const ll INF=(ll)1e9;const ll inf64=2e18;const ll INF64=9e18;
- #define PI 3.1415926535897932384626
- #define MOD 1000000007
- #define MOD1 998244353
- #define MOD2 1000000009
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
- ll gcd(ll a, ll b) {if (b > a) {return gcd(b, a);} if (b == 0) {return a;} return gcd(b, a % b);}
- ll power(ll x,ll y, ll p){if(y==0)return 1;ll res = 1;x = x % p;if (x == 0) return 0;while (y > 0){if (y & 1)res = (res*x) % p;y = y>>1;x = (x*x) % p;}return res;}
- ll pinv(ll a, ll m){ return power(a, m - 2, m); }
- ll int_sqrt (ll x) {ll ans = 0; for (ll k = 1LL << 30; k != 0; k /= 2) {if ((ans + k) * (ans + k) <= x) {ans += k;}} return ans;}
- ll logceil(ll x){ll s=0;while(x>0){s++;x=x/2;}return s;}
- ll mod_add(ll a, ll b, ll m) {a = a % m; b = b % m; return (((a + b) % m) + m) % m;}
- ll mod_mul(ll a, ll b, ll m) {a = a % m; b = b % m; return (((a * b) % m) + m) % m;}
- ll mod_sub(ll a, ll b, ll m) {a = a % m; b = b % m; return (((a - b) % m) + m) % m;}
- ll mod_div(ll a, ll b, ll m) {a = a % m; b = b % m; return (mod_mul(a, pinv(b, m), m) + m) % m;} //only for prime m
- ll phin(ll n) {ll number = n; if (n % 2 == 0) {number /= 2; while (n % 2 == 0) n /= 2;} for (ll i = 3; i <= sqrt(n); i += 2) {if (n % i == 0) {while (n % i == 0)n /= i; number = (number / i * (i - 1));}} if (n > 1)number = (number / n * (n - 1)) ; return number;} //O(sqrt(N))
- ll getRandomNumber(ll l, ll r) {return uniform_int_distribution<ll>(l, r)(rng);}
- void starter(int t) {cout << "Case #" << t << ": ";}
- /////////////////////////////////////////////////////////////////////////////////////////////////
- /*Don't loss hope, one day you will make it. Till then work hard.*/
- struct update
- {
- ll a,d;
- update(){
- a=0;
- d=0;
- }
- update(ll a,ll d){
- this->a=a;
- this->d=d;
- }
- bool operator==(const update& other) const{
- return a==other.a && d==other.d;
- }
- };
- #define ll long long
- template<class T, class U>
- // T -> node, U->update.
- struct Lsegtree{
- vector<T>st;
- vector<U>lazy;
- ll n;
- T identity_element;
- U identity_update;
- Lsegtree(ll n, T identity_element, U identity_update)
- {
- this->n = n;
- this->identity_element = identity_element;
- this->identity_update = identity_update;
- st.assign(4*n,identity_element);
- lazy.assign(4*n, identity_update);
- }
- T combine(T l, T r)
- {
- // change this function as required.
- T ans = (l + r);
- return ans;
- }
- void buildUtil(ll v, ll tl, ll tr, vector<T>&a)
- {
- if(tl == tr)
- {
- st[v] = a[tl];
- return;
- }
- ll tm = (tl + tr)>>1;
- buildUtil(2*v + 1, tl, tm,a);
- buildUtil(2*v + 2,tm+1,tr,a);
- st[v] = combine(st[2*v + 1], st[2*v + 2]);
- }
- // change the following 2 functions, and you're more or less done.
- T apply(T curr, U upd, ll tl, ll tr)
- {
- T ans = curr;
- ll n1=tr-tl+1;
- ll x=n1*(2*upd.a + (n1-1)*upd.d);
- x/=2;
- ans+=x;
- return ans;
- }
- U combineUpdate(U old_upd, U new_upd, ll tl, ll tr)
- {
- U ans = old_upd;
- ans.a+=new_upd.a;
- ans.d+=new_upd.d;
- return ans;
- }
- void push_down(ll v, ll tl, ll tr)
- {
- if(lazy[v] == identity_update)return;
- st[v] = apply(st[v], lazy[v], tl, tr);
- if(2*v + 2 < 4*n)
- {
- ll tm = (tl + tr)>>1;
- lazy[2*v + 1] = combineUpdate(lazy[2*v+1], lazy[v], tl, tm);
- U x=lazy[v];
- ll n1=tm+1-tl+1;
- x.a=x.a+(n1-1)*x.d;
- lazy[2*v + 2] = combineUpdate(lazy[2*v+2], x, tm+1,tr);
- }
- lazy[v] = identity_update;
- }
- T queryUtil(ll v, ll tl, ll tr, ll l, ll r)
- {
- push_down(v,tl,tr);
- if(l > r)return identity_element;
- if(tr < l or tl > r)
- {
- return identity_element;
- }
- if(l <= tl and r >= tr)
- {
- return st[v];
- }
- ll tm = (tl + tr)>>1;
- return combine(queryUtil(2*v+1,tl,tm,l,r), queryUtil(2*v+2,tm+1,tr,l,r));
- }
- void updateUtil(ll v, ll tl, ll tr, ll l, ll r, U upd)
- {
- push_down(v,tl,tr);
- if(tr < l or tl > r)return;
- if(tl >=l and tr <=r)
- {
- lazy[v] = combineUpdate(lazy[v],upd,tl,tr);
- push_down(v,tl,tr);
- }
- else
- {
- ll tm = (tl + tr)>>1;
- updateUtil(2*v+1,tl,tm,l,r,upd);
- updateUtil(2*v+2,tm+1,tr,l,r,upd);
- st[v] = combine(st[2*v + 1], st[2*v+2]);
- }
- }
- void build(vector<T>a)
- {
- assert(sz(a) == n);
- buildUtil(0,0,n-1,a);
- }
- T query(ll l, ll r)
- {
- return queryUtil(0,0,n-1,l,r);
- }
- void update(ll l,ll r, U upd)
- {
- updateUtil(0,0,n-1,l,r,upd);
- }
- };
- void chal(){
- ll n,m;
- cin>>n>>m;
- vl aa(n);
- fo(i,n){
- cin>>aa[i];
- }
- update upd(0,0);
- Lsegtree<ll,update> st(n,0,upd);
- st.build(aa);
- fo(i,m){
- ll ty;
- cin>>ty;
- if(ty==1){
- ll l,r;
- cin>>l>>r;
- l--;r--;
- update upd1(1,1);
- st.update(l,r,upd1);
- }else{
- ll l,r;
- cin>>l>>r;
- l--;r--;
- cout<<st.query(l,r)<<nline;
- }
- }
- }
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- int32_t main() {
- LagaKar;
- #ifdef hydracody
- freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout); freopen("error.txt", "w", stderr);
- #endif
- ll t; t = 1;
- // cin>>t;
- for (ll i = 1; i <= t; i++) {
- // cerr<<"Case : "<<i<<endl;
- // starter();
- chal();
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment