Submission #101077

#TimeUsernameProblemLanguageResultExecution timeMemory
101077BruteforcemanCake (CEOI14_cake)C++11
0 / 100
2067 ms4992 KiB
#include "bits/stdc++.h" using namespace std; const int inf = 1e9; const int ts = 250001; int d[250010]; int n, a; vector <int> best; int sz; struct tree { int t[250010 * 4]; void update(int x, int val, int c = 1, int b = 1, int e = ts) { if(b == e) { t[c] = val; return ; } int m = (b + e) >> 1; int l = c << 1; int r = l + 1; if(x <= m) update(x, val, l, b, m); else update(x, val, r, m + 1, e); t[c] = max(t[l], t[r]); } int query(int x, int y, int c = 1, int b = 1, int e = ts) { if(x <= b && e <= y) return t[c]; if(y < b || e < x) return 0; int m = (b + e) >> 1; int l = c << 1; int r = l + 1; return max(query(x, y, l, b, m), query(x, y, r, m + 1, e)); } int searchSuffix(int val, int c = 1, int b = 1, int e = ts) { if(b == e) { return t[c] > val ? b : 0; } int m = (b + e) >> 1; int l = c << 1; int r = l + 1; if(t[r] > val) return searchSuffix(val, r, m + 1, e); else return searchSuffix(val, l, b, m); } int searchPrefix(int val, int c = 1, int b = 1, int e = ts) { if(b == e) { return t[c] > val ? b : n+1; } int m = (b + e) >> 1; int l = c << 1; int r = l + 1; if(t[l] > val) return searchPrefix(val, l, b, m); else return searchPrefix(val, r, m + 1, e); } } P, S; int query(int b) { if(b == a) return 0; if(b < a) { int mx = P.query(b, a); int idx = S.searchPrefix(mx); return idx - b - 1; } else { int mx = S.query(a, b); int idx = P.searchSuffix(mx); return b - idx - 1; } } bool cmp(int p, int q) { return d[p] > d[q]; } void update(int p, int q) { if(p == a) return ; --q; int pos = -1; for(int i = 0; i < sz; i++) { if(best[i] == p) { pos = i; break; } } if(pos == -1) { d[p] = d[best[q]]; best.insert(best.begin() + q, p); best.pop_back(); for(int i = 0; i <= q; i++) { d[best[i]] += 1; } } else { while(pos < q) { swap(d[best[pos]], d[best[pos + 1]]); swap(best[pos], best[pos + 1]); ++pos; } while(pos > q) { swap(d[best[pos]], d[best[pos - 1]]); swap(best[pos], best[pos - 1]); --pos; } } for(int i = 0; i < sz; i++) { // cout << best[i] << " " << d[best[i]] << endl; if(best[i] < a) { P.update(best[i], d[best[i]]); } else { S.update(best[i], d[best[i]]); } } } int main(int argc, char const *argv[]) { scanf("%d %d", &n, &a); sz = n - 1; for(int i = 1; i <= n; i++) { scanf("%d", &d[i]); if(i != a) { best.emplace_back(i); } } sort(best.begin(), best.end(), cmp); best.resize(sz); for(int i = a + 1; i <= n; i++) { S.update(i, d[i]); } for(int i = 1; i < a; i++) { P.update(i, d[i]); } int q; scanf("%d", &q); while(q--) { char c; int p, q; scanf(" %c", &c); if(c == 'F') { scanf("%d", &p); printf("%d\n", query(p)); } else { scanf("%d %d", &p, &q); update(p, q); } } return 0; }

Compilation message (stderr)

cake.cpp: In function 'int main(int, const char**)':
cake.cpp:111:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d %d", &n, &a);
  ~~~~~^~~~~~~~~~~~~~~~~
cake.cpp:114:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d", &d[i]);
   ~~~~~^~~~~~~~~~~~~
cake.cpp:129:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d", &q);
  ~~~~~^~~~~~~~~~
cake.cpp:133:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf(" %c", &c);
   ~~~~~^~~~~~~~~~~
cake.cpp:135:9: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
    scanf("%d", &p);
    ~~~~~^~~~~~~~~~
cake.cpp:138:9: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
    scanf("%d %d", &p, &q);
    ~~~~~^~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...