답안 #1046921

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1046921 2024-08-07T06:19:06 Z vjudge1 Index (COCI21_index) C++17
110 / 110
1330 ms 148688 KB
/*
Author: Teoman Ata Korkmaz
*/
#pragma GCC optimize("O3,fast-math,unroll-loops")
#include <bits/stdc++.h> 
//#include <ext/pb_ds/assoc_container.hpp>
//#include <ext/pb_ds/tree_policy.hpp>
#define ff first
#define ss second
#define endl '\n'
#define spc ' '
#define pb push_back
#define e2(x) (1LL<<(x))
#define lg(x) (__lg(x))
#define gcd(x,y) __gcd(x,y)
#define lcm(x,y) ((x/gcd(x,y))*y)
#define smrt(i) (double(sqrt(8*(i)+1)-1)/2)
#define ssum(x) ((x)*((x)+1)/2)
#define isint(x) (ceil((x))==floor((x)))
#define no cout<<"NO"<<endl
#define yes cout<<"YES"<<endl
#define cendl cout<<endl
#define mset(x,y) memset(x,y,sizeof(x))
#define popcnt(x) __builtin_popcountll(x)
#define clz(x) __builtin_clz(x)
#define all(x) x.begin(),x.end()
#define rall(x) x.rbegin(),x.rend()
#define clock() (chrono::high_resolution_clock::now().time_since_epoch().count())
#define compress(x) sort(all(x));x.resize(unique(all(x))-x.begin())
#define fastio ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);cerr.tie(NULL);cout<<fixed<<setprecision(0);cerr<<fixed<<setprecision(0)
#define fileio freopen("out.txt","w",stdout);freopen("in.txt","r",stdin)
#define usacoio(s) freopen((s + str(".in")).c_str(), "r", stdin);freopen((s + str(".out")).c_str(), "w", stdout)
#define ordered_set tree<int, null_type,less<int>, rb_tree_tag,tree_order_statistics_node_update> 
using namespace std;
//using namespace __gnu_pbds;
typedef int_fast32_t i32;
typedef int_fast64_t ll;
typedef long double ldouble;
typedef string str;
typedef pair<int,int> ii;
typedef pair<int,ii> iii;
typedef pair<ii,ii> iiii;
typedef vector<int> vi;
typedef vector<ii> vii;
typedef vector<iii> viii;
typedef vector<vi> vvi;
typedef vector<vvi> vvvi;
typedef vector<pair<char,int>> vci;
typedef vector<str> vstr;
typedef map<int,int> mii;
typedef map<char,int> mci;
typedef map<str,int> msi;
typedef map<int,vi> miv;
typedef unordered_map<int,int> umii;
typedef unordered_map<char,int> umci;
typedef unordered_map<str,int> umsi;
typedef unordered_map<int,vi> umiv;
typedef set<int> sti;
typedef set<char> stc;
typedef set<str> sts;
typedef multiset<int> msti;
typedef multiset<char> mstc;
typedef multiset<str> msts;
inline int segsum(int start,int end,int step){
    if(end<start)return 0;
    return (((end-start)/step+1)*(start+end))>>1;
}
inline int fp(int b,int p,int mod=1e9+7){
    int ans=1;
    while(p){
        if(p&1)ans=(ans*b)%mod;
        p>>=1;
        b=(b*b)%mod;
    }
    return ans;
}
template<typename InputIterator,typename T = int>
T accumulate(InputIterator first,InputIterator last,T init = T{}) {
    for (; first != last; ++first) {
        init += *first;
    }
    return init;
}
template<typename T,typename T2>inline pair<T,T2> operator+(const pair<T,T2>&a,const pair<T,T2>& b){return {a.ff+b.ff,a.ss+b.ss};}
template<typename T,typename T2>inline pair<T,T2> operator-(const pair<T,T2>&a,const pair<T,T2>& b){return {a.ff-b.ff,a.ss-b.ss};}
template<typename T,typename T2>inline pair<T,T2> operator*(const pair<T,T2>&a,const pair<T,T2>& b){return {a.ff*b.ff,a.ss*b.ss};}
template<typename T,typename T2>inline pair<T,T2> operator/(const pair<T,T2>&a,const pair<T,T2>& b){return {a.ff/b.ff,a.ss/b.ss};}
template<typename T> inline void maxs(T& x,const T& y){return void(x=max(x,y));}
template<typename T> inline void mins(T& x,const T& y){return void(x=min(x,y));}
template<typename T> inline void gcds(T& x,const T& y){return void(x=gcd(x,y));}
template<typename T> inline void lcms(T& x,const T& y){return void(x=lcm(x,y));}
template<typename T,typename T2>inline ostream& operator<<(ostream& os, const pair<T,T2>& p){
    os<<"["<<p.ff<<","<<p.ss<<"]";
    return os;
}
template<typename T>inline ostream& operator<<(ostream& os,const vector<T>& a) {
    for(const T& _:a)os<<_<<' ';
    return os;
}
template<typename T>inline ostream& operator<<(ostream& os,const vector<vector<T>>& a) {
    for(const vector<T>& _:a)os<<_<<endl;
    return os;
}
template<typename T>inline ostream& operator<<(ostream& os,const set<T>& a) {
    for(const T& _:a)os<<_<<' ';
    return os;
}
template<typename T,typename T2>inline ostream& operator<<(ostream& os,const map<T,T2>& a) {
    for(const auto& _:a)os<<_<<' ';
    return os;
}
template<typename T,typename T2>inline ostream& operator<<(ostream& os,const unordered_map<T,T2>& a) {
    for(const auto& _:a)os<<_<<' ';
    return os;
}
template<typename T>inline ostream& operator<<(ostream& os,const queue<T>& b) {
    queue<T> a=b;
    while(a.size()){
        os<<a.front()<<" ";
        a.pop();
    }
    return os;
}
template<typename T>inline ostream& operator<<(ostream& os,const stack<T>& b) {
    stack<T> a=b;
    while(a.size()){
        os<<a.top()<<" ";
        a.pop();
    }
    return os;
}
template<typename T>inline ostream& operator<<(ostream& os,const priority_queue<T>& b) {
    priority_queue<T> a=b;
    while(a.size()){
        os<<a.top()<<" ";
        a.pop();
    }
    return os;
}
template<typename T>inline ostream& operator<<(ostream& os,const priority_queue<T,vector<T>,greater<T>>& b) {
    priority_queue<T,vector<T>,greater<T>> a=b;
    while(a.size()){
        os<<a.top()<<" ";
        a.pop();
    }
    return os;
}
template<typename T,typename T2>inline istream& operator>>(istream& is,pair<T,T2>& p){
    is>>(p.ff)>>(p.ss);
    return is;
}
template<typename T>inline istream& operator>>(istream& is,vector<T>& a) {
    for(T& _:a)is>>_;
    return is;
}
inline void print(){cout<<endl;}
template<typename... Args>
inline void print(const Args&... args){
    ((cout<<args<<' '),...)<<endl;
}
inline void input(){}
template<typename... Args>
inline void input(Args&... args){
    (cin>>...>>args);
}
#ifdef ONLINE_JUDGE
template<typename... Args>
inline void debug(const Args&... args){
    return void("59");
}
#else
inline void debug(){cerr<<endl;}
template<typename... Args>
inline void debug(const Args&... args){
    ((cerr<<args<<' '),...)<<endl;
}
#endif
inline void yn(bool b){
    if(b)yes;
    else no;
}
#define ASSERT(condition, message)\
if(condition){\
    cerr<<"Assertion failed: "<<message<<" at "<<__FILE__<<":"<<to_string(__LINE__)<<endl;\
    abort();\
}
///////////////////////////////////////////////////////////////////
const int N=2e5+5;
const int A=1e9+5;
const int MOD=1e9+7;
const i32 INF=INT32_MAX;
const ll  INFL=INT64_MAX;
const int BLOCK=448;
const ldouble EPS=1e-9;
const int MAXQUERY=100;
const double PI=4*atan(1);
const int dx[4]={-1,0,1,0};
const int dy[4]={0,1,0,-1};
mt19937 mt(clock());
///////////////////////////////////////////////////////////////////
int n,m,k,t,q,a,b,x,y,w;
vi v;

struct Node{
    int val;
    Node* left;
    Node* right;
    Node(int x=0):val(x),left(NULL),right(NULL){}
    Node(Node* x):val(x->val),left(x->left),right(x->right){}
    Node(Node* l,Node* r){
        left=l,right=r,val=0;
        if(l)val+=l->val;
        if(r)val+=r->val;
    }
};

#define mid ((l+r)>>1)

inline Node* build(int l=1,int r=n){
    if(l==r)return new Node(1);
    else    return new Node(build(l,mid),build(mid+1,r));
}

inline Node* update(Node* node,int l=1,int r=n){
    //debug("u! l,r,x:",l,r,x);
    if(l==r)       return new Node(int(0));
    if(x<=mid)return new Node(update(node->left,l,mid),node->right);
    else      return new Node(node->left,update(node->right,mid+1,r));
}

inline int query(Node* node,int l=1,int r=n){
    if(x<=l && r<=y)return node->val;
    if(r<x || y<l)return 0;
    return query(node->left,l,mid)+query(node->right,mid+1,r);
}

inline void _debug(Node* root){
    queue<Node*> q;
    q.push(root);
    while(q.size()){
        Node* node=q.front();q.pop();
        if(node==NULL)continue;
        cerr<<(node->val)<<" ";
        q.push(node->left);
        q.push(node->right);
    }
    debug();
}

#undef mid

inline void solve(void){
    Node* root[N];
    input(n,q);
    v.resize(n);
    input(v);

    vvi arr(*max_element(all(v))+2);
    for(int i=0;i<n;i++)arr[v[i]].pb(i+1);

    root[1]=build();
    //_debug(root[1]);
    //debug("build ok");
    for(int i=2;i<arr.size();i++){
        root[i]=new Node(root[i-1]);
        for(auto j:arr[i-1]){
            x=j;
            root[i]=update(root[i]);
        }
        //debug("update",i,"ok");,
        //_debug(root[i]);
    }
    //debug("updates ok");
    while(q--){
        input(x,y);
        int l=1,r=y-x+2;
        while(l<r){
            int m=(l+r)>>1;
            if(query(root[m])>=m)l=m+1;
            else r=m;
        }
        print(l-1);
    }
}

signed main(void){
    int start=clock();
    fastio;
    //usacoio("59");
    int t=1;
    //cin>>t;
    while(t--)solve();
    debug("Time elapsed:",(clock()-start)/(1e6),"ms");
}

Compilation message

index.cpp: In function 'void solve()':
index.cpp:264:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::vector<int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  264 |     for(int i=2;i<arr.size();i++){
      |                 ~^~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 2396 KB Output is correct
2 Correct 3 ms 2396 KB Output is correct
3 Correct 2 ms 2396 KB Output is correct
4 Correct 2 ms 2396 KB Output is correct
5 Correct 3 ms 2396 KB Output is correct
6 Correct 3 ms 2396 KB Output is correct
7 Correct 2 ms 2396 KB Output is correct
8 Correct 2 ms 2396 KB Output is correct
9 Correct 2 ms 2396 KB Output is correct
10 Correct 2 ms 2396 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 2396 KB Output is correct
2 Correct 3 ms 2396 KB Output is correct
3 Correct 2 ms 2396 KB Output is correct
4 Correct 2 ms 2396 KB Output is correct
5 Correct 3 ms 2396 KB Output is correct
6 Correct 3 ms 2396 KB Output is correct
7 Correct 2 ms 2396 KB Output is correct
8 Correct 2 ms 2396 KB Output is correct
9 Correct 2 ms 2396 KB Output is correct
10 Correct 2 ms 2396 KB Output is correct
11 Correct 202 ms 35308 KB Output is correct
12 Correct 196 ms 35544 KB Output is correct
13 Correct 187 ms 35408 KB Output is correct
14 Correct 191 ms 35468 KB Output is correct
15 Correct 177 ms 35468 KB Output is correct
16 Correct 170 ms 35488 KB Output is correct
17 Correct 175 ms 35472 KB Output is correct
18 Correct 177 ms 35516 KB Output is correct
19 Correct 175 ms 35408 KB Output is correct
20 Correct 198 ms 35520 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 2396 KB Output is correct
2 Correct 3 ms 2396 KB Output is correct
3 Correct 2 ms 2396 KB Output is correct
4 Correct 2 ms 2396 KB Output is correct
5 Correct 3 ms 2396 KB Output is correct
6 Correct 3 ms 2396 KB Output is correct
7 Correct 2 ms 2396 KB Output is correct
8 Correct 2 ms 2396 KB Output is correct
9 Correct 2 ms 2396 KB Output is correct
10 Correct 2 ms 2396 KB Output is correct
11 Correct 202 ms 35308 KB Output is correct
12 Correct 196 ms 35544 KB Output is correct
13 Correct 187 ms 35408 KB Output is correct
14 Correct 191 ms 35468 KB Output is correct
15 Correct 177 ms 35468 KB Output is correct
16 Correct 170 ms 35488 KB Output is correct
17 Correct 175 ms 35472 KB Output is correct
18 Correct 177 ms 35516 KB Output is correct
19 Correct 175 ms 35408 KB Output is correct
20 Correct 198 ms 35520 KB Output is correct
21 Correct 1267 ms 148620 KB Output is correct
22 Correct 1198 ms 148564 KB Output is correct
23 Correct 1237 ms 148564 KB Output is correct
24 Correct 1287 ms 148688 KB Output is correct
25 Correct 1330 ms 148560 KB Output is correct
26 Correct 1202 ms 148476 KB Output is correct
27 Correct 1244 ms 148608 KB Output is correct
28 Correct 1198 ms 148616 KB Output is correct
29 Correct 1217 ms 148564 KB Output is correct
30 Correct 1322 ms 148564 KB Output is correct