Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- #define FRE(i,a,b) for(i = a; i <= b; i++)
- #define FRL(i,a,b) for(i = a; i < b; i++)
- #define mem(t, v) memset ((t) , v, sizeof(t))
- #define sqr(x) (x)*(x)
- #define all(x) x.begin(),x.end()
- #define un(x) x.erase(unique(all(x)), x.end())
- #define sf(n) scanf("%d", &n)
- #define sff(a,b) scanf("%d %d", &a, &b)
- #define sfff(a,b,c) scanf("%d %d %d", &a, &b, &c)
- #define D(x) cout<<#x " = "<<(x)<<endl
- #define pf printf
- #define VI vector <int>
- #define pii pair <int, int>
- #define pll pair <LL, LL>
- #define pb push_back
- #define mp make_pair
- #define pi acos(-1.00)
- #define DBG pf("Hi\n")
- #define sz size()
- #define ins insert
- #define fi first
- #define se second
- #define xx first
- #define yy second
- #define inf (1<<29)
- #define MOD 1000000007
- #define eps 1e-9
- #define MAX 30000
- typedef long long int LL;
- typedef double db;
- //int dx[] = {+0,+1,+0,-1};
- //int dy[] = {+1,+0,-1,+0};
- //int dx[] = {-1,-1,-1,+0,+0,+1,+1,+1};
- //int dy[] = {-1,+0,+1,-1,+1,-1,+0,+1};
- //bool check(int n, int pos) {return (bool) (n & (1<<pos));}
- //int on(int n, int pos) {return n | (1<<pos); }
- //int off(int n, int pos) {return n & ~(1<<pos); }
- int n, m, tree[MAX*4 + 10], A[MAX+10];
- void update(int node, int st, int ed, int pos)
- {
- if(st > pos || ed < pos)
- return;
- if(st == ed)
- {
- tree[node] = A[pos];
- return;
- }
- int mid, left, right;
- mid = (st + ed)/2;
- left = node * 2;
- right = left + 1;
- update(left, st, mid, pos);
- update(right, mid+1, ed, pos);
- tree[node] = min(tree[left],tree[right]);
- }
- int Q(int node, int st, int ed, int qst, int qed)
- {
- if(st > qed || ed < qst)
- return inf;
- if(st == ed)
- return tree[node];
- int mid, right, left;
- mid = (st +ed) /2 ;
- left = node*2;
- right = node*2 + 1;
- int ret = Q(left, st, mid, qst, qed);
- ret = min(ret,Q(right, mid+1, ed, qst, qed));
- return ret;
- }
- int main()
- {
- int i, j, k, t, cs;
- int nw, hi, lo, mid;
- sf(t);
- FRE(cs , 1, t)
- {
- sf(n);
- FRE(i, 1, n)
- sf(A[i]);
- FRE(i,1,n)
- update(1, 1, n, i);
- int ans = -12;
- FRE(i,1,n)
- {
- hi = n;
- lo = i;
- while(lo<hi)
- {
- mid = lo + ceil((hi-lo)/2.0) + eps;
- if(Q(1,1,n,i+1,mid)<A[i])
- hi = mid-1;
- else
- lo = mid;
- }
- j = lo;
- hi = 1;
- lo = i;
- while(hi<lo)
- {
- mid = lo + (hi-lo)/2.0;
- if(Q(1,1,n,mid,lo)<A[i])
- hi = mid + 1;
- else
- lo = mid;
- }
- k = lo;
- nw = (j-k+1)*A[i];
- ans = max(ans, nw);
- }
- pf("Case %d: %d\n",cs, ans);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement