Submission #1274789

#TimeUsernameProblemLanguageResultExecution timeMemory
1274789uzukishinobu역사적 조사 (JOI14_historical)C++20
100 / 100
121 ms8020 KiB
#include <bits/stdc++.h>
#define int long long
using namespace std;
int a,b;
int z[1000005];
vector <int> v;
int cnt[1000005];
int res[1000005];
struct node{
     int l,r,id;
};
vector <node> q[100005];
bool cmp(node a,node b){
    return a.r<b.r;
}

signed main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> a >> b;
    for (int i=1;i<=a;i++){
         cin >> z[i];
         v.push_back(z[i]);
    }
    sort(v.begin(),v.end());
    v.erase(unique(v.begin(),v.end()),v.end());
    for (int i=1;i<=a;i++){
         z[i]=lower_bound(v.begin(),v.end(),z[i])-v.begin();
    }
    int block=sqrt(a);

    for (int i=1;i<=b;i++){
         int x,y;
         cin >> x >> y;
         if (x/block==y/block){
//             cout << x  << " " <<  y << " " << cnt[1]  << "\n";
             int max1=0;
             for (int j=x;j<=y;j++){
                  cnt[z[j]]++;
                  max1=max(max1,cnt[z[j]]*v[z[j]]);
             }
             for (int j=x;j<=y;j++){
                  cnt[z[j]]--;
             }
             res[i]=max1;
         }else{
             q[x/block].push_back({x,y,i});
         }
    }
    for (int i=0;i<=a;i++){
         sort(q[i].begin(),q[i].end(),cmp);
    }
    for (int j=0;j*block<=a;j++){
         int r=(j+1)*block;
         int max1=0;
         for (auto [u,v1,id]:q[j]){
              while (r<=a && r<=v1){
                   cnt[z[r]]++;
                   max1=max(max1,v[z[r]]*cnt[z[r]]);
                   r++;
              }
              res[id]=max1;
              for (int i=u;i<(j+1)*block;i++){
                  cnt[z[i]]++;
                  res[id]=max(res[id],cnt[z[i]]*v[z[i]]);
              }
              for (int i=u;i<(j+1)*block;i++){
                  cnt[z[i]]--;
              }
         }
         for (int i=0;i<v.size();i++){
              cnt[i]=0;
         }
    }
    for (int i=1;i<=b;i++){
         cout << res[i] << "\n";
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...