Submission #1265681

#TimeUsernameProblemLanguageResultExecution timeMemory
1265681asemoonabiZIGZAG (INOI20_zigzag)C++20
0 / 100
478 ms77220 KiB
#include <bits/stdc++.h> using namespace std ; typedef long long ll ; #define loop(n) for(int i = 0 ;i < n ; i++) #define lid id<<1 #define rid lid|1 #define mid (l+r)/2 #define el '\n' #define yes cout<<"Yes"<<el #define no cout<<"No"<<el const ll maxn = 2e6 + 100 ; const ll oo = 1e17 + 100 ; const ll mod = 1e9+7 ; struct Data{ll ans , ptl1 , ptl2 , ptr1 , ptr2 , L , R , zrb , jm ;} ; ll n , q , a[maxn] ; Data node[maxn] ; void relax(ll l , ll r , ll id){ node[lid].L = node[lid].L*node[id].zrb + node[id].jm ; node[lid].R = node[lid].R*node[id].zrb + node[id].jm ; node[rid].L = node[rid].L*node[id].zrb + node[id].jm ; node[rid].R = node[rid].R*node[id].zrb + node[id].jm ; if(node[id].zrb == -1){ swap(node[lid].ptl1,node[lid].ptl2) ; swap(node[lid].ptr1,node[lid].ptr2) ; swap(node[rid].ptl1,node[rid].ptl2) ; swap(node[rid].ptr1,node[rid].ptr2) ; } ll a = node[lid].zrb , b = node[lid].jm ; ll c = node[id].zrb , d = node[id].jm ; node[lid].zrb = c*a , node[lid].jm = c*b + d ; a = node[rid].zrb , b = node[rid].jm ; c = node[id].zrb , d = node[id].jm ; node[rid].zrb = c*a , node[rid].jm = c*b + d ; node[id].zrb = 1 , node[id].jm = 0 ; return ; } Data make_node(ll l , ll r , Data left , Data right){ Data D ; D.ptl1 = left.ptl1 , D.ptl2 = left.ptl2 ; D.ptr1 = right.ptr1 , D.ptr2 = right.ptr2 ; D.ans = left.ans + right.ans ; if((left.R < right.L && (mid-1)%2 == 0) || (left.R > right.L && (mid-1)%2 == 1)){ D.ans += (mid-left.ptr1)*(right.ptl1-mid+1) ; if(left.ptl1 == mid-1){D.ptl1 = right.ptl1;} if(right.ptr1 == mid){D.ptr1 = left.ptr1 ;} } if((left.R > right.L && (mid-1)%2 == 0) || (left.R < right.L && (mid-1)%2 == 1)){ D.ans += (mid-left.ptr2)*(right.ptl2-mid+1) ; if(left.ptl2 == mid-1){D.ptl2 = right.ptl2;} if(right.ptr2 == mid){D.ptr2 = left.ptr2 ;} } D.L = left.L , D.R = right.R ; return D ; } void build(ll l , ll r , ll id){ if(l+1 == r){ node[id].ans = 1 ; node[id].ptl1 = node[id].ptl2 = node[id].ptr1 = node[id].ptr2 = l ; node[id].zrb = 1 , node[id].jm = 0 ; node[id].L = a[l] , node[id].R = a[l] ; return ; } build(l,mid,lid) ; build(mid,r,rid) ; node[id] = make_node(l,r,node[lid],node[rid]) ; node[id].zrb = 1 , node[id].jm = 0 ; return ; } void update(ll s , ll e , ll l , ll r , ll id , ll x){ if(e <= l || r <= s){return;} if(s <= l && r <= e){ if(x == oo){ node[id].L *= -1 , node[id].R *= -1 ; swap(node[id].ptl1,node[id].ptl2) ; swap(node[id].ptr1,node[id].ptr2) ; node[id].zrb *= -1 , node[id].jm *= -1 ; } else{ node[id].L += x , node[id].R += x ; node[id].jm += x ; } return ; } relax(l,r,id) ; update(s,e,l,mid,lid,x) ; update(s,e,mid,r,rid,x) ; node[id] = make_node(l,r,node[lid],node[rid]) ; return ; } Data get(ll s , ll e , ll l , ll r , ll id){ Data D ; if(e <= l || r <= s){ D.ans = 0 ; D.ptl1 = D.ptl2 = l-1 ; D.ptr1 = D.ptr2 = r ; D.L = 0 , D.R = 0 ; D.zrb = 1 , D.jm = 0 ; return D ; } if(s <= l && r <= e){return node[id];} relax(l,r,id) ; return make_node(l,r,get(s,e,l,mid,lid),get(s,e,mid,r,rid)) ; } void solve(){ cin>>n>>q ; for(ll i = 0 ; i < n ; i++){cin>>a[i];} build(0,n,1) ; for(ll _ = 0 ; _ < q ; _++){ char ch ; cin>>ch ; ll l , r ; cin>>l>>r ; l-- ; if(ch == '+'){ ll x ; cin>>x ; update(l,r,0,n,1,x) ; } if(ch == '*'){ update(l,r,0,n,1,oo) ; } if(ch == '?'){ cout<<get(l,r,0,n,1).ans<<el ; } } return ; } int main(){ //std::ios_base::sync_with_stdio(false) , cin.tie(nullptr) ; ll t = 1; //cin>>t ; while(t--){ solve() ; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...