Submission #366542

#TimeUsernameProblemLanguageResultExecution timeMemory
366542nicolaalexandraSimple game (IZhO17_game)C++14
100 / 100
804 ms19788 KiB
#include <bits/stdc++.h> #define DIM 100010 using namespace std; struct segment_tree{ int sum,lazy; } aint[DIM*40]; int n,m,i,j,x,y,poz,val,q,tip; int v[DIM]; void update_lazy (int nod, int st, int dr){ if (!aint[nod].lazy) return; if (st != dr){ int fiu_st = nod<<1, fiu_dr = (nod<<1)|1; aint[fiu_st].sum += aint[nod].lazy; aint[fiu_st].lazy += aint[nod].lazy; aint[fiu_dr].sum += aint[nod].lazy; aint[fiu_dr].lazy += aint[nod].lazy; } aint[nod].lazy = 0; } void update (int nod, int st, int dr, int x, int y, int val){ update_lazy (nod,st,dr); if (x <= st && dr <= y){ aint[nod].sum += val; aint[nod].lazy += val; update_lazy (nod,st,dr); return; } int mid = (st+dr)>>1; if (x <= mid) update (nod<<1,st,mid,x,y,val); if (y > mid) update ((nod<<1)|1,mid+1,dr,x,y,val); update_lazy (nod<<1,st,mid); update_lazy ((nod<<1)|1,mid+1,dr); aint[nod].sum = aint[(nod<<1)].sum + aint[(nod<<1)|1].sum; } int query (int nod, int st, int dr, int poz){ update_lazy(nod,st,dr); if (st == dr) return aint[nod].sum; int mid = (st+dr)>>1; if (poz <= mid) return query (nod<<1,st,mid,poz); else return query ((nod<<1)|1,mid+1,dr,poz); } int main (){ //ifstream cin ("date.in"); //ofstream cout ("date.out"); cin>>n>>q; for (i=1;i<=n;i++) cin>>v[i]; m = 1000000; //m = 7; for (i=1;i<n;i++){ int x = v[i], y = v[i+1]; if (x > y) swap (x,y); update (1,1,m,x,y,1); } for (i=2;i<n;i++) update (1,1,m,v[i],v[i],-1); for (;q--;){ cin>>tip; if (tip == 1){ cin>>poz>>val; if (poz > 1){ int x = v[poz-1], y = v[poz]; if (x > y) swap (x,y); update (1,1,m,x,y,-1); } if (poz < n){ int x = v[poz], y = v[poz+1]; if (x > y) swap (x,y); update (1,1,m,x,y,-1); } if (poz > 1 && poz < n) update (1,1,m,v[poz],v[poz],1); v[poz] = val; if (poz > 1){ int x = v[poz-1], y = v[poz]; if (x > y) swap (x,y); update (1,1,m,x,y,1); } if (poz < n){ int x = v[poz], y = v[poz+1]; if (x > y) swap (x,y); update (1,1,m,x,y,1); } if (poz > 1 && poz < n) update (1,1,m,v[poz],v[poz],-1); } else { cin>>poz; cout<<query(1,1,m,poz)<<"\n"; } } return 0; }/// copy paste ioit
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...