Submission #101087

#TimeUsernameProblemLanguageResultExecution timeMemory
101087BruteforcemanCake (CEOI14_cake)C++11
10 / 100
2099 ms5152 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) { --q; int pos = find(best.begin(), best.end(), p) - best.begin(); 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 < best.size(); i++) { if(best[i] == a) continue; 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); for(int i = 1; i <= n; i++) { scanf("%d", &d[i]); best.emplace_back(i); } sort(best.begin(), best.end(), cmp); 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 'void update(int, int)':
cake.cpp:83:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i = 0; i < best.size(); i++) {
                 ~~^~~~~~~~~~~~~
cake.cpp: In function 'int main(int, const char**)':
cake.cpp:95: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:97:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d", &d[i]);
   ~~~~~^~~~~~~~~~~~~
cake.cpp:108:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d", &q);
  ~~~~~^~~~~~~~~~
cake.cpp:112:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf(" %c", &c);
   ~~~~~^~~~~~~~~~~
cake.cpp:114:9: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
    scanf("%d", &p);
    ~~~~~^~~~~~~~~~
cake.cpp:117: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...