Untitled
unknown
plain_text
10 months ago
3.8 kB
0
Indexable
#include <iostream> #include <math.h> #include <climits> using namespace std; int streamer[200005]; struct GROUP{ int sum_subs; int max, min; int index_max, index_min; } group[450]; int K; void init(int N, int mSubscriber[]) { K = sqrt(N); int sum_group = 0; int max_group = INT_MIN; int min_group = INT_MAX; int id_min, id_max; for(int i = 0; i < N; i++){ streamer[i] = mSubscriber[i]; sum_group += streamer[i]; if(streamer[i] > max_group){ max_group = streamer[i]; id_max = i; } if(streamer[i] < min_group){ min_group = streamer[i]; id_min = i; } if((i + 1) % K == 0){ group[i/K].sum_subs = sum_group; group[i/K].max = max_group; group[i/K].min = min_group; group[i/K].index_max = id_max; group[i/K].index_min = id_min; sum_group = 0; max_group = INT_MIN; min_group = INT_MAX; } } return; } int subscribe(int mId, int mNum) { int index = mId - 1; streamer[index] += mNum; int temp = index/K; group[temp].sum_subs += mNum; int max_group = INT_MIN; int min_group = INT_MAX; int start = temp * K; int end = start + K - 1; for(int i = start; i <= end; i++){ if(streamer[i] > max_group){ max_group = streamer[i]; group[temp].max = max_group; group[temp].index_max = i; } if(streamer[i] < min_group){ min_group = streamer[i]; group[temp].min = min_group; group[temp].index_min = i; } } /*if(index == group[temp].index_max){ group[temp].max = streamer[index]; } else{ if(streamer[index] > group[temp].max){ group[temp].max = streamer[index]; group[temp].index_max = index; } }*/ return streamer[index]; } int unsubscribe(int mId, int mNum) { int index = mId - 1; streamer[index] -= mNum; int temp = index/K; group[temp].sum_subs -= mNum; int max_group = INT_MIN; int min_group = INT_MAX; int start = temp * K; int end = start + K - 1; for(int i = start; i <= end; i++){ if(streamer[i] > max_group){ max_group = streamer[i]; group[temp].max = max_group; group[temp].index_max = i; } if(streamer[i] < min_group){ min_group = streamer[i]; group[temp].min = min_group; group[temp].index_min = i; } } /*if(index == group[temp].index_min){ group[temp].min = streamer[index]; } else{ if(streamer[index] < group[temp].min){ group[temp].min = streamer[index]; group[temp].index_min = index; } }*/ return streamer[index]; } int count(int sId, int eId) { int sum = 0; sId--; eId--; for(int i = sId; i <= eId; i++){ if(i % K == 0 && i + K - 1 <= eId){ sum += group[i/K].sum_subs; i = i + K - 1; } else sum += streamer[i]; } return sum; } int calculate(int sId, int eId) { int maxi = 0; int mini = INT_MAX; sId--; eId--; for(int i = sId; i <= eId; i++){ if(i % K == 0 && i + K - 1 <= eId){ if(group[i/K].max > maxi) maxi = group[i/K].max; if(group[i/K].min < mini) mini = group[i/K].min; i = i + K - 1; } else{ if(streamer[i] > maxi) maxi = streamer[i]; if(streamer[i] < mini) mini = streamer[i]; } } int answer = maxi - mini; return answer; }
Editor is loading...
Leave a Comment