权值分块就是快……Rank5……
1 #include2 #include 3 #include 4 using namespace std; 5 #define N 38001 6 #define INF 2147483647 7 #define min(a,b) (((a)<(b))?(a):(b)) 8 struct Point{ int v,p;}t[N]; 9 bool operator < (const Point &a,const Point &b){ return a.v '9';c=getchar())if(c=='-')f=-1;14 for(x=0;c>='0'&&c<='9';c=getchar())(x*=10)+=(c-'0');15 x*=f;16 }17 void makeblock()18 {19 sz=sqrt(en); if(!sz) sz=1;20 for(sum=1;sum*sz 1) return x;34 for(int i=x+1;i<=r[num[x]];i++) if(b[i]) return i;35 for(int i=num[x]+1;i<=sum;i++) if(sumv[i])36 for(int j=l[i];;j++)37 if(b[j]) return j;38 return INF;39 }40 inline int Pre(const int &x)41 {42 if(b[x]>1) return x;43 for(int i=x-1;i>=l[num[x]];i--) if(b[i]) return i;44 for(int i=num[x]-1;i>=1;i--) if(sumv[i])45 for(int j=r[i];;j--)46 if(b[j]) return j;47 return INF;48 }49 int main()50 {51 R(n); for(int i=1;i